@@ -186,30 +186,45 @@ func (r *delegatingResolver) Close() {
186186 r .proxyResolver = nil
187187}
188188
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 {
198190 for _ , addr := range state .Addresses {
199- if networkType := networkTypeFromAddr (addr ); networkType == "tcp" {
191+ if ! skipProxy (addr ) {
200192 return true
201193 }
202194 }
203195 for _ , endpoint := range state .Endpoints {
204196 for _ , addr := range endpoint .Addresses {
205- if networktype := networkTypeFromAddr (addr ); networktype == "tcp" {
197+ if ! skipProxy (addr ) {
206198 return true
207199 }
208200 }
209201 }
210202 return false
211203}
212204
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+
213228// updateClientConnStateLocked constructs a combined list of addresses by
214229// pairing each proxy address with every target address of type TCP. For each
215230// pair, it creates a new [resolver.Address] using the proxy address and
@@ -240,8 +255,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
240255 }
241256 var addresses []resolver.Address
242257 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 ) {
245259 addresses = append (addresses , targetAddr )
246260 continue
247261 }
@@ -259,7 +273,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
259273 var addrs []resolver.Address
260274 for _ , targetAddr := range endpt .Addresses {
261275 // Avoid proxy when network is not tcp.
262- if networkType := networkTypeFromAddr (targetAddr ); networkType != "tcp" {
276+ if skipProxy (targetAddr ) {
263277 addrs = append (addrs , targetAddr )
264278 continue
265279 }
@@ -340,9 +354,10 @@ func (r *delegatingResolver) updateTargetResolverState(state resolver.State) err
340354 logger .Infof ("Addresses received from target resolver: %v" , state .Addresses )
341355 }
342356 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 ) {
346361 return r .cc .UpdateState (* r .targetResolverState )
347362 }
348363
0 commit comments