@@ -186,30 +186,45 @@ func (r *delegatingResolver) Close() {
186186r .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 {
198190for _ ,addr := range state .Addresses {
199- if networkType := networkTypeFromAddr (addr ); networkType == "tcp" {
191+ if ! skipProxy (addr ) {
200192return true
201193}
202194}
203195for _ ,endpoint := range state .Endpoints {
204196for _ ,addr := range endpoint .Addresses {
205- if networktype := networkTypeFromAddr (addr ); networktype == "tcp" {
197+ if ! skipProxy (addr ) {
206198return true
207199}
208200}
209201}
210202return 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}
241256var addresses []resolver.Address
242257for _ ,targetAddr := range (* r .targetResolverState ).Addresses {
243- // Avoid proxy when network is not tcp.
244- if networkType := networkTypeFromAddr (targetAddr );networkType != "tcp" {
258+ if skipProxy (targetAddr ) {
245259addresses = append (addresses ,targetAddr )
246260continue
247261}
@@ -259,7 +273,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
259273var addrs []resolver.Address
260274for _ ,targetAddr := range endpt .Addresses {
261275// Avoid proxy when network is not tcp.
262- if networkType := networkTypeFromAddr (targetAddr ); networkType != "tcp" {
276+ if skipProxy (targetAddr ) {
263277addrs = append (addrs ,targetAddr )
264278continue
265279}
@@ -340,9 +354,10 @@ func (r *delegatingResolver) updateTargetResolverState(state resolver.State) err
340354logger .Infof ("Addresses received from target resolver: %v" ,state .Addresses )
341355}
342356r .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 ) {
346361return r .cc .UpdateState (* r .targetResolverState )
347362}
348363