Skip to content

Commit 531df95

Browse files
delegatingresolver: avoid proxy for resolved addresses in NO_PROXY env (#8329)
1 parent 3b5fa74 commit 531df95

File tree

3 files changed

+172
-258
lines changed

3 files changed

+172
-258
lines changed

internal/resolver/delegatingresolver/delegatingresolver.go

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)