summaryrefslogtreecommitdiff
path: root/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go')
-rw-r--r--vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go49
1 files changed, 32 insertions, 17 deletions
diff --git a/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go
index c0e227577..20b8fb098 100644
--- a/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go
+++ b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go
@@ -186,23 +186,15 @@ func (r *delegatingResolver) Close() {
r.proxyResolver = nil
}
-func networkTypeFromAddr(addr resolver.Address) string {
- networkType, ok := networktype.Get(addr)
- if !ok {
- networkType, _ = transport.ParseDialTarget(addr.Addr)
- }
- return networkType
-}
-
-func isTCPAddressPresent(state *resolver.State) bool {
+func needsProxyResolver(state *resolver.State) bool {
for _, addr := range state.Addresses {
- if networkType := networkTypeFromAddr(addr); networkType == "tcp" {
+ if !skipProxy(addr) {
return true
}
}
for _, endpoint := range state.Endpoints {
for _, addr := range endpoint.Addresses {
- if networktype := networkTypeFromAddr(addr); networktype == "tcp" {
+ if !skipProxy(addr) {
return true
}
}
@@ -210,6 +202,29 @@ func isTCPAddressPresent(state *resolver.State) bool {
return false
}
+func skipProxy(address resolver.Address) bool {
+ // Avoid proxy when network is not tcp.
+ networkType, ok := networktype.Get(address)
+ if !ok {
+ networkType, _ = transport.ParseDialTarget(address.Addr)
+ }
+ if networkType != "tcp" {
+ return true
+ }
+
+ req := &http.Request{URL: &url.URL{
+ Scheme: "https",
+ Host: address.Addr,
+ }}
+ // Avoid proxy when address included in `NO_PROXY` environment variable or
+ // fails to get the proxy address.
+ url, err := HTTPSProxyFromEnvironment(req)
+ if err != nil || url == nil {
+ return true
+ }
+ return false
+}
+
// updateClientConnStateLocked constructs a combined list of addresses by
// pairing each proxy address with every target address of type TCP. For each
// pair, it creates a new [resolver.Address] using the proxy address and
@@ -240,8 +255,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
}
var addresses []resolver.Address
for _, targetAddr := range (*r.targetResolverState).Addresses {
- // Avoid proxy when network is not tcp.
- if networkType := networkTypeFromAddr(targetAddr); networkType != "tcp" {
+ if skipProxy(targetAddr) {
addresses = append(addresses, targetAddr)
continue
}
@@ -259,7 +273,7 @@ func (r *delegatingResolver) updateClientConnStateLocked() error {
var addrs []resolver.Address
for _, targetAddr := range endpt.Addresses {
// Avoid proxy when network is not tcp.
- if networkType := networkTypeFromAddr(targetAddr); networkType != "tcp" {
+ if skipProxy(targetAddr) {
addrs = append(addrs, targetAddr)
continue
}
@@ -340,9 +354,10 @@ func (r *delegatingResolver) updateTargetResolverState(state resolver.State) err
logger.Infof("Addresses received from target resolver: %v", state.Addresses)
}
r.targetResolverState = &state
- // If no addresses returned by resolver have network type as tcp , do not
- // wait for proxy update.
- if !isTCPAddressPresent(r.targetResolverState) {
+ // If all addresses returned by the target resolver have a non-TCP network
+ // type, or are listed in the `NO_PROXY` environment variable, do not wait
+ // for proxy update.
+ if !needsProxyResolver(r.targetResolverState) {
return r.cc.UpdateState(*r.targetResolverState)
}