-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathio.go
More file actions
38 lines (32 loc) · 722 Bytes
/
io.go
File metadata and controls
38 lines (32 loc) · 722 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package httpproxy
import (
"errors"
"io"
"net"
"sync"
)
type halfClosable interface {
net.Conn
CloseWrite() error
CloseRead() error
}
var _ halfClosable = (*net.TCPConn)(nil)
func copyAndClose(dst, src halfClosable, wg *sync.WaitGroup) {
defer wg.Done()
_, _ = io.Copy(dst, src)
_ = dst.CloseWrite()
_ = src.CloseRead()
}
func copyUntilClosed(ch chan<- error, dst io.Writer, src io.Reader) {
_, err := io.Copy(dst, src)
if errors.Is(err, net.ErrClosed) {
err = nil
}
ch <- err
}
func proxyUntilClosed(targetConn io.ReadWriter, clientConn io.ReadWriter) error {
ch := make(chan error, 2)
go copyUntilClosed(ch, targetConn, clientConn)
go copyUntilClosed(ch, clientConn, targetConn)
return <-ch
}