@@ -21,39 +21,32 @@ import (
21
21
"github.com/wallarm/api-firewall/internal/config"
22
22
)
23
23
24
+ const defaultConcurrency = 1000
25
+
24
26
var (
25
27
errInvalidCapacitySetting = errors .New ("invalid capacity settings" )
26
- errClosed = errors .New ("err: chan closed" )
28
+ errClosed = errors .New ("chan closed" )
29
+ errInvalidDNSResolver = errors .New ("invalid DNS resolver" )
27
30
)
28
31
29
32
func (p * chanPool ) tryResolveAndFetchOneIP (host string ) (string , error ) {
30
33
31
- var ips []net.IP
32
34
var resolvedIP string
33
- var err error
34
35
35
- if p .dnsCacheResolver != nil {
36
- ips , err = p .dnsCacheResolver .Fetch (context .Background (), host )
37
- if err != nil {
38
- return "" , err
39
- }
40
- } else {
41
- // resolve host using local resolver
42
- ips , err = p .defaultResolver .LookupIP (context .Background (), "ip" , host )
43
- if err != nil {
44
- return "" , err
45
- }
36
+ ipAddrs , err := p .dnsResolver .LookupIPAddr (context .Background (), host )
37
+ if err != nil {
38
+ return "" , err
46
39
}
47
40
48
- for _ , ip := range ips {
49
- if ip .To4 () != nil {
41
+ for _ , ip := range ipAddrs {
42
+ if ip .IP . To4 () != nil {
50
43
resolvedIP = ip .String ()
51
44
return resolvedIP , nil
52
45
}
53
46
}
54
47
55
- for _ , ip := range ips {
56
- if ip .To16 () != nil {
48
+ for _ , ip := range ipAddrs {
49
+ if ip .IP . To16 () != nil {
57
50
resolvedIP = ip .String ()
58
51
return resolvedIP , nil
59
52
}
@@ -73,21 +66,19 @@ func (p *chanPool) factory(connAddr string) HTTPClient {
73
66
DisableHeaderNamesNormalizing : true ,
74
67
DisablePathNormalizing : true ,
75
68
Dial : func (addr string ) (net.Conn , error ) {
76
- return fasthttp .DialTimeout (connAddr , p .options .DialTimeout )
69
+ tcpDialer := & fasthttp.TCPDialer {
70
+ Concurrency : defaultConcurrency ,
71
+ Resolver : p .dnsResolver ,
72
+ DisableDNSResolution : p .options .DNSConfig .Cache ,
73
+ }
74
+ return tcpDialer .DialTimeout (connAddr , p .options .DialTimeout )
77
75
},
78
76
TLSConfig : p .tlsConfig ,
79
77
MaxConnsPerHost : p .options .MaxConnsPerHost ,
80
78
ReadTimeout : p .options .ReadTimeout ,
81
79
WriteTimeout : p .options .WriteTimeout ,
82
80
}
83
81
84
- // use configured NS
85
- if p .options .DNSConfig .Nameserver .Host != "" {
86
- proxyClient .Dial = (& fasthttp.TCPDialer {
87
- Resolver : p .defaultResolver ,
88
- }).Dial
89
- }
90
-
91
82
return & proxyClient
92
83
}
93
84
@@ -121,9 +112,8 @@ type chanPool struct {
121
112
initResolvedIP string
122
113
initConnAddr string
123
114
124
- tlsConfig * tls.Config
125
- defaultResolver * net.Resolver
126
- dnsCacheResolver DNSCache
115
+ tlsConfig * tls.Config
116
+ dnsResolver DNSCache
127
117
}
128
118
129
119
type Options struct {
@@ -140,11 +130,15 @@ type Options struct {
140
130
}
141
131
142
132
// NewChanPool to new a pool with some params
143
- func NewChanPool (hostAddr string , options * Options , dnsCacheResolver DNSCache ) (Pool , error ) {
133
+ func NewChanPool (hostAddr string , options * Options , dnsResolver DNSCache ) (Pool , error ) {
144
134
if options .InitialPoolCapacity < 0 || options .ClientPoolCapacity <= 0 || options .InitialPoolCapacity > options .ClientPoolCapacity {
145
135
return nil , errInvalidCapacitySetting
146
136
}
147
137
138
+ if dnsResolver == nil {
139
+ return nil , errInvalidDNSResolver
140
+ }
141
+
148
142
// Get the SystemCertPool, continue with an empty pool on error
149
143
rootCAs , err := x509 .SystemCertPool ()
150
144
if err != nil {
@@ -182,23 +176,7 @@ func NewChanPool(hostAddr string, options *Options, dnsCacheResolver DNSCache) (
182
176
host : host ,
183
177
port : port ,
184
178
tlsConfig : tlsConfig ,
185
- defaultResolver : & net.Resolver {
186
- PreferGo : true ,
187
- },
188
- dnsCacheResolver : dnsCacheResolver ,
189
- }
190
-
191
- // init NS in the DNS resolver
192
- if options .DNSConfig .Nameserver .Host != "" {
193
- var builder strings.Builder
194
- builder .WriteString (options .DNSConfig .Nameserver .Host )
195
- builder .WriteString (":" )
196
- builder .WriteString (options .DNSConfig .Nameserver .Port )
197
-
198
- pool .defaultResolver .Dial = func (ctx context.Context , network , address string ) (net.Conn , error ) {
199
- d := net.Dialer {}
200
- return d .DialContext (ctx , options .DNSConfig .Nameserver .Proto , builder .String ())
201
- }
179
+ dnsResolver : dnsResolver ,
202
180
}
203
181
204
182
ip , err := pool .tryResolveAndFetchOneIP (host )
@@ -220,20 +198,18 @@ func NewChanPool(hostAddr string, options *Options, dnsCacheResolver DNSCache) (
220
198
221
199
connAddr := pool .initConnAddr
222
200
223
- if pool .dnsCacheResolver != nil {
224
- ip , err = pool .tryResolveAndFetchOneIP (pool .host )
225
- if err != nil {
226
- continue
227
- }
201
+ ip , err = pool .tryResolveAndFetchOneIP (pool .host )
202
+ if err != nil {
203
+ continue
204
+ }
228
205
229
- builder .Reset ()
206
+ builder .Reset ()
230
207
231
- builder .WriteString (ip )
232
- builder .WriteString (":" )
233
- builder .WriteString (port )
208
+ builder .WriteString (ip )
209
+ builder .WriteString (":" )
210
+ builder .WriteString (port )
234
211
235
- connAddr = builder .String ()
236
- }
212
+ connAddr = builder .String ()
237
213
238
214
proxy := pool .factory (connAddr )
239
215
if pool .reverseProxyChanLB [ip ] == nil {
@@ -261,9 +237,7 @@ func (p *chanPool) Close() {
261
237
close (reverseProxyChan )
262
238
}
263
239
264
- if p .dnsCacheResolver != nil {
265
- p .dnsCacheResolver .Stop ()
266
- }
240
+ p .dnsResolver .Stop ()
267
241
268
242
}
269
243
0 commit comments