@@ -17,6 +17,33 @@ import (
17
17
"golang.org/x/net/proxy"
18
18
)
19
19
20
+ type ContextDialer struct {
21
+ dialer proxy.Dialer
22
+ }
23
+
24
+ func (c * ContextDialer ) DialContext (ctx context.Context , network , addr string ) (net.Conn , error ) {
25
+ connChan := make (chan net.Conn , 1 )
26
+ errChan := make (chan error , 1 )
27
+
28
+ go func () {
29
+ conn , err := c .dialer .Dial (network , addr )
30
+ if err != nil {
31
+ errChan <- err
32
+ return
33
+ }
34
+ connChan <- conn
35
+ }()
36
+
37
+ select {
38
+ case conn := <- connChan :
39
+ return conn , nil
40
+ case err := <- errChan :
41
+ return nil , err
42
+ case <- ctx .Done ():
43
+ return nil , ctx .Err ()
44
+ }
45
+ }
46
+
20
47
type Proxy struct {
21
48
// Type set proxy type.
22
49
// Can specify `http`, `https`, `socks`, `socks5`, `command`.
@@ -49,7 +76,8 @@ type Proxy struct {
49
76
}
50
77
51
78
// CreateProxyDialer retrun proxy.Dialer.
52
- func (p * Proxy ) CreateProxyDialer () (proxyDialer proxy.Dialer , err error ) {
79
+ func (p * Proxy ) CreateProxyDialer () (proxyContextDialer proxy.ContextDialer , err error ) {
80
+ var proxyDialer proxy.Dialer
53
81
switch p .Type {
54
82
case "http" , "https" :
55
83
proxyDialer , err = p .CreateHttpProxyDialer ()
@@ -59,6 +87,8 @@ func (p *Proxy) CreateProxyDialer() (proxyDialer proxy.Dialer, err error) {
59
87
proxyDialer , err = p .CreateProxyCommandProxyDialer ()
60
88
}
61
89
90
+ proxyContextDialer = & ContextDialer {dialer : proxyDialer }
91
+
62
92
return
63
93
}
64
94
0 commit comments