@@ -349,8 +349,6 @@ func UnderlyingConn(c net.Conn) net.Conn {
349
349
return c
350
350
}
351
351
352
- func goCloseConn (c net.Conn ) { go c .Close () }
353
-
354
352
// HandleConn implements the Target interface.
355
353
func (dp * DialProxy ) HandleConn (src net.Conn ) {
356
354
ctx := context .Background ()
@@ -366,13 +364,13 @@ func (dp *DialProxy) HandleConn(src net.Conn) {
366
364
dp .onDialError ()(src , err )
367
365
return
368
366
}
369
- defer goCloseConn ( dst )
367
+ defer dst . Close ( )
370
368
371
369
if err = dp .sendProxyHeader (dst , src ); err != nil {
372
370
dp .onDialError ()(src , err )
373
371
return
374
372
}
375
- defer goCloseConn ( src )
373
+ defer src . Close ( )
376
374
377
375
if ka := dp .keepAlivePeriod (); ka > 0 {
378
376
if c , ok := UnderlyingConn (src ).(* net.TCPConn ); ok {
@@ -393,7 +391,12 @@ func (dp *DialProxy) HandleConn(src net.Conn) {
393
391
errc := make (chan error , 1 )
394
392
go proxyCopy (errc , src , dst )
395
393
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
+ }
397
400
}
398
401
399
402
func (dp * DialProxy ) sendProxyHeader (w io.Writer , src net.Conn ) error {
@@ -444,6 +447,14 @@ func proxyCopy(errc chan<- error, dst, src net.Conn) {
444
447
dst = UnderlyingConn (dst )
445
448
446
449
_ , 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
+
447
458
errc <- err
448
459
}
449
460
0 commit comments