@@ -2,12 +2,17 @@ package grpc
2
2
3
3
import (
4
4
"context"
5
+ "net"
6
+ "net/url"
7
+ "os"
5
8
"sync"
6
9
"time"
7
10
8
11
"github.com/operator-framework/operator-registry/pkg/client"
9
12
10
13
"github.com/sirupsen/logrus"
14
+ "golang.org/x/net/http/httpproxy"
15
+ "golang.org/x/net/proxy"
11
16
"google.golang.org/grpc"
12
17
"google.golang.org/grpc/connectivity"
13
18
@@ -100,10 +105,69 @@ func (s *SourceStore) Get(key registry.CatalogKey) *SourceConn {
100
105
return & source
101
106
}
102
107
108
+ func grpcProxyURL (addr string ) (* url.URL , error ) {
109
+ // Handle ip addresses
110
+ host , _ , err := net .SplitHostPort (addr )
111
+ if err != nil {
112
+ return nil , err
113
+ }
114
+
115
+ url , err := url .Parse (host )
116
+ if err != nil {
117
+ return nil , err
118
+ }
119
+
120
+ // Hardcode fields required for proxy resolution
121
+ url .Host = addr
122
+ url .Scheme = "http"
123
+
124
+ proxyConfig := httpproxy .FromEnvironment ()
125
+
126
+ // Override HTTPS_PROXY and HTTP_PROXY with GRPC_PROXY
127
+ proxyConfig .HTTPProxy = getGRPCProxyEnv ()
128
+ proxyConfig .HTTPSProxy = getGRPCProxyEnv ()
129
+
130
+ // Check if a proxy should be used based on Environment variables
131
+ return proxyConfig .ProxyFunc ()(url )
132
+ }
133
+
134
+ func getGRPCProxyEnv () string {
135
+ return getEnvAny ("GRPC_PROXY" , "grpc_proxy" )
136
+ }
137
+
138
+ func getEnvAny (names ... string ) string {
139
+ for _ , n := range names {
140
+ if val := os .Getenv (n ); val != "" {
141
+ return val
142
+ }
143
+ }
144
+ return ""
145
+ }
146
+
147
+ func grpcConnection (address string ) (* grpc.ClientConn , error ) {
148
+ // Check if a proxy should be used based on Environment variables
149
+ proxyURL , err := grpcProxyURL (address )
150
+ if err != nil {
151
+ return nil , err
152
+ }
153
+
154
+ if proxyURL != nil {
155
+ return grpc .Dial (address , grpc .WithInsecure (), grpc .WithContextDialer (func (ctx context.Context , addr string ) (net.Conn , error ) {
156
+ dialer , err := proxy .FromURL (proxyURL , & net.Dialer {})
157
+ if err != nil {
158
+ return nil , err
159
+ }
160
+ return dialer .Dial ("tcp" , addr )
161
+ }))
162
+ }
163
+
164
+ return grpc .Dial (address , grpc .WithInsecure ())
165
+ }
166
+
103
167
func (s * SourceStore ) Add (key registry.CatalogKey , address string ) (* SourceConn , error ) {
104
168
_ = s .Remove (key )
105
169
106
- conn , err := grpc . Dial (address , grpc . WithInsecure () )
170
+ conn , err := grpcConnection (address )
107
171
if err != nil {
108
172
return nil , err
109
173
}
0 commit comments