Skip to content

Commit 6f85d8e

Browse files
committed
Implement correct half-close sequence for the connections.
Fixes inetaf#21 Signed-off-by: Andrey Smirnov <[email protected]>
1 parent 8bea9a4 commit 6f85d8e

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ module inet.af/tcpproxy
22

33
go 1.16
44

5-
require github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a
5+
require (
6+
github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a
7+
golang.org/x/sys v0.8.0
8+
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a h1:AP/vsCIvJZ129pdm9Ek7bH7yutN3hByqsMoNrWAxRQc=
22
github.com/armon/go-proxyproto v0.0.0-20210323213023-7e956b284f0a/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU=
3+
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
4+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

tcpproxy.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,6 @@ func UnderlyingConn(c net.Conn) net.Conn {
349349
return c
350350
}
351351

352-
func goCloseConn(c net.Conn) { go c.Close() }
353-
354352
// HandleConn implements the Target interface.
355353
func (dp *DialProxy) HandleConn(src net.Conn) {
356354
ctx := context.Background()
@@ -366,13 +364,13 @@ func (dp *DialProxy) HandleConn(src net.Conn) {
366364
dp.onDialError()(src, err)
367365
return
368366
}
369-
defer goCloseConn(dst)
367+
defer dst.Close()
370368

371369
if err = dp.sendProxyHeader(dst, src); err != nil {
372370
dp.onDialError()(src, err)
373371
return
374372
}
375-
defer goCloseConn(src)
373+
defer src.Close()
376374

377375
if ka := dp.keepAlivePeriod(); ka > 0 {
378376
if c, ok := UnderlyingConn(src).(*net.TCPConn); ok {
@@ -393,7 +391,12 @@ func (dp *DialProxy) HandleConn(src net.Conn) {
393391
errc := make(chan error, 1)
394392
go proxyCopy(errc, src, dst)
395393
go proxyCopy(errc, dst, src)
396-
<-errc
394+
395+
for i := 0; i < 2; i++ {
396+
if err = <-errc; err != nil {
397+
return
398+
}
399+
}
397400
}
398401

399402
func (dp *DialProxy) sendProxyHeader(w io.Writer, src net.Conn) error {
@@ -444,6 +447,14 @@ func proxyCopy(errc chan<- error, dst, src net.Conn) {
444447
dst = UnderlyingConn(dst)
445448

446449
_, err := io.Copy(dst, src)
450+
451+
if tcpConn, ok := dst.(*net.TCPConn); ok {
452+
tcpConn.CloseWrite()
453+
}
454+
if tcpConn, ok := src.(*net.TCPConn); ok {
455+
tcpConn.CloseRead()
456+
}
457+
447458
errc <- err
448459
}
449460

0 commit comments

Comments
 (0)