Skip to content

Commit 12053b8

Browse files
committed
Improved relay handling
1 parent 4a0b15d commit 12053b8

File tree

1 file changed

+11
-16
lines changed

1 file changed

+11
-16
lines changed

tcp.go

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package main
22

33
import (
44
"bufio"
5+
"errors"
56
"io"
67
"io/ioutil"
78
"net"
9+
"os"
810
"sync"
911
"time"
1012

@@ -83,11 +85,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
8385
}
8486

8587
logf("proxy %s <-> %s <-> %s", c.RemoteAddr(), server, tgt)
86-
err = relay(rc, c)
87-
if err != nil {
88-
if err, ok := err.(net.Error); ok && err.Timeout() {
89-
return // ignore i/o timeout
90-
}
88+
if err = relay(rc, c); err != nil {
9189
logf("relay error: %v", err)
9290
}
9391
}()
@@ -137,18 +135,14 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
137135
defer rc.Close()
138136

139137
logf("proxy %s <-> %s", c.RemoteAddr(), tgt)
140-
err = relay(sc, rc)
141-
if err != nil {
142-
if err, ok := err.(net.Error); ok && err.Timeout() {
143-
return // ignore i/o timeout
144-
}
138+
if err = relay(sc, rc); err != nil {
145139
logf("relay error: %v", err)
146140
}
147141
}()
148142
}
149143
}
150144

151-
// relay copies between left and right bidirectionally. Returns any error occurred.
145+
// relay copies between left and right bidirectionally
152146
func relay(left, right net.Conn) error {
153147
var err, err1 error
154148
var wg sync.WaitGroup
@@ -159,15 +153,16 @@ func relay(left, right net.Conn) error {
159153
_, err1 = io.Copy(right, left)
160154
right.SetReadDeadline(time.Now().Add(wait)) // unblock read on right
161155
}()
162-
163156
_, err = io.Copy(left, right)
164157
left.SetReadDeadline(time.Now().Add(wait)) // unblock read on left
165158
wg.Wait()
166-
167-
if err1 != nil {
168-
err = err1
159+
if err1 != nil && !errors.Is(err1, os.ErrDeadlineExceeded) { // requires Go 1.15+
160+
return err1
161+
}
162+
if err != nil && !errors.Is(err, os.ErrDeadlineExceeded) {
163+
return err
169164
}
170-
return err
165+
return nil
171166
}
172167

173168
type corkedConn struct {

0 commit comments

Comments
 (0)