@@ -23,19 +23,31 @@ type ProxyDialer interface {
23
23
}
24
24
25
25
type ContextDialer struct {
26
- dialer proxy.Dialer
26
+ Dialer proxy.Dialer
27
+ }
28
+
29
+ func (c * ContextDialer ) GetDialer () proxy.Dialer {
30
+ return c .Dialer
27
31
}
28
32
29
33
func (c * ContextDialer ) Dial (network , addr string ) (net.Conn , error ) {
30
- return c .dialer .Dial (network , addr )
34
+ return c .Dialer .Dial (network , addr )
31
35
}
32
36
33
37
func (c * ContextDialer ) DialContext (ctx context.Context , network , addr string ) (net.Conn , error ) {
38
+ // Simply call the DialContext method if supported
39
+ if dialerCtx , ok := c .Dialer .(interface {
40
+ DialContext (context.Context , string , string ) (net.Conn , error )
41
+ }); ok {
42
+ return dialerCtx .DialContext (ctx , network , addr )
43
+ }
44
+
45
+ // Fallback if DialContext is not supported
34
46
connChan := make (chan net.Conn , 1 )
35
47
errChan := make (chan error , 1 )
36
48
37
49
go func () {
38
- conn , err := c .dialer .Dial (network , addr )
50
+ conn , err := c .Dialer .Dial (network , addr )
39
51
if err != nil {
40
52
errChan <- err
41
53
return
@@ -96,7 +108,7 @@ func (p *Proxy) CreateProxyDialer() (proxyContextDialer ProxyDialer, err error)
96
108
proxyDialer , err = p .CreateProxyCommandProxyDialer ()
97
109
}
98
110
99
- proxyContextDialer = & ContextDialer {dialer : proxyDialer }
111
+ proxyContextDialer = & ContextDialer {Dialer : proxyDialer }
100
112
101
113
return
102
114
}
@@ -158,6 +170,8 @@ func (p *Proxy) CreateProxyCommandProxyDialer() (proxyDialer proxy.Dialer, err e
158
170
159
171
type NetPipe struct {
160
172
Command string
173
+ ctx context.Context
174
+ Cmd * exec.Cmd
161
175
}
162
176
163
177
func (n * NetPipe ) Dial (network , addr string ) (con net.Conn , err error ) {
@@ -167,15 +181,15 @@ func (n *NetPipe) Dial(network, addr string) (con net.Conn, err error) {
167
181
// Create net.Pipe(), and set proxyCommand
168
182
con , srv := net .Pipe ()
169
183
170
- cmd : = exec .Command ("sh" , "-c" , n .Command )
184
+ n . Cmd = exec .Command ("sh" , "-c" , n .Command )
171
185
172
186
// setup FD
173
- cmd .Stdin = srv
174
- cmd .Stdout = srv
175
- cmd .Stderr = os .Stderr
187
+ n . Cmd .Stdin = srv
188
+ n . Cmd .Stdout = srv
189
+ n . Cmd .Stderr = os .Stderr
176
190
177
- // run proxyCommand
178
- err = cmd .Start ()
191
+ // Start the command
192
+ err = n . Cmd .Start ()
179
193
180
194
return
181
195
}
@@ -190,6 +204,7 @@ func (n *NetPipe) DialContext(ctx context.Context, network, addr string) (con ne
190
204
errChan <- err
191
205
return
192
206
}
207
+
193
208
connChan <- conn
194
209
}()
195
210
@@ -199,6 +214,7 @@ func (n *NetPipe) DialContext(ctx context.Context, network, addr string) (con ne
199
214
case err := <- errChan :
200
215
return nil , err
201
216
case <- ctx .Done ():
217
+ n .Cmd .Process .Kill ()
202
218
return nil , ctx .Err ()
203
219
}
204
220
}
@@ -258,29 +274,6 @@ func (s *httpProxy) Dial(network, addr string) (net.Conn, error) {
258
274
return c , nil
259
275
}
260
276
261
- func (s * httpProxy ) DialContext (ctx context.Context , network , addr string ) (con net.Conn , err error ) {
262
- connChan := make (chan net.Conn , 1 )
263
- errChan := make (chan error , 1 )
264
-
265
- go func () {
266
- conn , err := s .Dial (network , addr )
267
- if err != nil {
268
- errChan <- err
269
- return
270
- }
271
- connChan <- conn
272
- }()
273
-
274
- select {
275
- case conn := <- connChan :
276
- return conn , nil
277
- case err := <- errChan :
278
- return nil , err
279
- case <- ctx .Done ():
280
- return nil , ctx .Err ()
281
- }
282
- }
283
-
284
277
// newHttpProxy
285
278
func newHttpProxy (uri * url.URL , forward proxy.Dialer ) (proxy.Dialer , error ) {
286
279
s := new (httpProxy )
0 commit comments