grpc-proxy is a minimal configuration library that acts as a local HTTP proxy and transparently proxies all gRPC requests to the requested destination. A gRPC StreamClientInterceptor can be registered which will be called for all requests and lets you do anything that gRPC middleware can do.
For example you can build applications that:
grpc-dump).grpc-fixture).grpc-proxy is super simple to use, this short snippet is a simplified version of grpc-dump that logs the service names of all intercepted methods:
package main
import (
"flag"
"fmt"
"github.com/bradleyjkemp/grpc-tools/grpc-proxy"
"google.golang.org/grpc"
)
func main() {
grpc_proxy.RegisterDefaultFlags()
flag.Parse()
proxy, _ := grpc_proxy.New(
grpc_proxy.WithInterceptor(intercept),
grpc_proxy.DefaultFlags(),
)
proxy.Start()
}
func intercept(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
fmt.Println(info.FullMethod)
return handler(srv, ss)
}
grpc-proxy can only intercept requests if the application supports HTTP proxies. The standard gRPC libraries support HTTP proxies by default but applications can override this behaviour by using a custom Dialer.
Troubleshooting steps:
grpc-proxy in fallback mode.Check your application is configured to use the HTTP proxy. This is normally done by setting the http_proxy or all_proxy environment variable to the address grpc-proxy is listening on (e.g. http_proxy=http://localhost:12345).
Some applications interpret these environment variables differently, you may have to set both http_proxy and https_proxy to point to grpc-proxy.
Try using grpc-proxy as your system proxy. This will mean traffic from all applications will go through the proxy. You can find instructions for this here.
Warning: this may cause other applications to not work properly if grpc-proxy is unable to proxy its requests properly. It’s preferable to only configure the target application to use the proxy to minimise potential disruption.
grpc-proxy in fallback mode instead (see below for details).grpc-proxy in fallback modeFor applications that do not work with HTTP proxies, grpc-proxy can act as an explicit proxy server.
Rather than letting grpc-proxy try to transparently intercept requests you should configure your application to connect directly to your proxy and use the Destination setting to tell grpc-proxy to send all traffic to the specified host.