@@ -186,30 +186,45 @@ func (r *delegatingResolver) Close() {
186
186
r .proxyResolver = nil
187
187
}
188
188
189
- func networkTypeFromAddr (addr resolver.Address ) string {
190
- networkType , ok := networktype .Get (addr )
191
- if ! ok {
192
- networkType , _ = transport .ParseDialTarget (addr .Addr )
193
- }
194
- return networkType
195
- }
196
-
197
- func isTCPAddressPresent (state * resolver.State ) bool {
189
+ func needsProxyResolver (state * resolver.State ) bool {
198
190
for _ , addr := range state .Addresses {
199
- if networkType := networkTypeFromAddr (addr ); networkType == "tcp" {
191
+ if ! skipProxy (addr ) {
200
192
return true
201
193
}
202
194
}
203
195
for _ , endpoint := range state .Endpoints {
204
196
for _ , addr := range endpoint .Addresses {
205
- if networktype := networkTypeFromAddr (addr ); networktype == "tcp" {
197
+ if ! skipProxy (addr ) {
206
198
return true
207
199
}
208
200
}
209
201
}
210
202
return false
211
203
}
212
204
205
+ func skipProxy (address resolver.Address ) bool {
206
+ // Avoid proxy when network is not tcp.
207
+ networkType , ok := networktype .Get (address )
208
+ if ! ok {
209
+ networkType , _ = transport .ParseDialTarget (address .Addr )
210
+ }
211
+ if networkType != "tcp" {
212
+ return true
213
+ }
214
+
215
+ req := & http.Request {URL : & url.URL {
216
+ Scheme : "https" ,
217
+ Host : address .Addr ,
218
+ }}
219
+ // Avoid proxy when address included in `NO_PROXY` environment variable or
220
+ // fails to get the proxy address.
221
+ url , err := HTTPSProxyFromEnvironment (req )
222
+ if err != nil || url == nil {
223
+ return true
224
+ }
225
+ return false
226
+ }
227
+
213
228
// updateClientConnStateLocked constructs a combined list of addresses by
214
229
// pairing each proxy address with every target address of type TCP. For each
215
230
// pair, it creates a new [resolver.Address] using the proxy address and
@@ -240,8 +255,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
240
255
}
241
256
var addresses []resolver.Address
242
257
for _ , targetAddr := range (* r .targetResolverState ).Addresses {
243
- // Avoid proxy when network is not tcp.
244
- if networkType := networkTypeFromAddr (targetAddr ); networkType != "tcp" {
258
+ if skipProxy (targetAddr ) {
245
259
addresses = append (addresses , targetAddr )
246
260
continue
247
261
}
@@ -259,7 +273,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
259
273
var addrs []resolver.Address
260
274
for _ , targetAddr := range endpt .Addresses {
261
275
// Avoid proxy when network is not tcp.
262
- if networkType := networkTypeFromAddr (targetAddr ); networkType != "tcp" {
276
+ if skipProxy (targetAddr ) {
263
277
addrs = append (addrs , targetAddr )
264
278
continue
265
279
}
@@ -340,9 +354,10 @@ func (r *delegatingResolver) updateTargetResolverState(state resolver.State) err
340
354
logger .Infof ("Addresses received from target resolver: %v" , state .Addresses )
341
355
}
342
356
r .targetResolverState = & state
343
- // If no addresses returned by resolver have network type as tcp , do not
344
- // wait for proxy update.
345
- if ! isTCPAddressPresent (r .targetResolverState ) {
357
+ // If all addresses returned by the target resolver have a non-TCP network
358
+ // type, or are listed in the `NO_PROXY` environment variable, do not wait
359
+ // for proxy update.
360
+ if ! needsProxyResolver (r .targetResolverState ) {
346
361
return r .cc .UpdateState (* r .targetResolverState )
347
362
}
348
363
0 commit comments