@@ -2,9 +2,11 @@ package main
2
2
3
3
import (
4
4
"bufio"
5
+ "errors"
5
6
"io"
6
7
"io/ioutil"
7
8
"net"
9
+ "os"
8
10
"sync"
9
11
"time"
10
12
@@ -83,11 +85,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
83
85
}
84
86
85
87
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 {
91
89
logf ("relay error: %v" , err )
92
90
}
93
91
}()
@@ -137,18 +135,14 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
137
135
defer rc .Close ()
138
136
139
137
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 {
145
139
logf ("relay error: %v" , err )
146
140
}
147
141
}()
148
142
}
149
143
}
150
144
151
- // relay copies between left and right bidirectionally. Returns any error occurred.
145
+ // relay copies between left and right bidirectionally
152
146
func relay (left , right net.Conn ) error {
153
147
var err , err1 error
154
148
var wg sync.WaitGroup
@@ -159,15 +153,16 @@ func relay(left, right net.Conn) error {
159
153
_ , err1 = io .Copy (right , left )
160
154
right .SetReadDeadline (time .Now ().Add (wait )) // unblock read on right
161
155
}()
162
-
163
156
_ , err = io .Copy (left , right )
164
157
left .SetReadDeadline (time .Now ().Add (wait )) // unblock read on left
165
158
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
169
164
}
170
- return err
165
+ return nil
171
166
}
172
167
173
168
type corkedConn struct {
0 commit comments