diff --git a/proxy/handler.go b/proxy/handler.go index 752f892..e988ddf 100644 --- a/proxy/handler.go +++ b/proxy/handler.go @@ -9,6 +9,8 @@ import ( "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" ) var ( @@ -70,7 +72,18 @@ func (s *handler) handler(srv interface{}, serverStream grpc.ServerStream) error } clientCtx, clientCancel := context.WithCancel(outgoingCtx) - // TODO(mwitkow): Add a `forwarded` header to metadata, https://en.wikipedia.org/wiki/X-Forwarded-For. + md, ok := metadata.FromIncomingContext(clientCtx) + if !ok { + return status.Error(codes.Internal, ":authority header has not been set") + } + authority, ok := md[":authority"] + if !ok { + return status.Error(codes.Internal, ":authority header has not been set") + } + md = md.Copy() // metadata is immutable, copy. + md["x-forwarded-host"] = authority + + clientCtx = metadata.NewOutgoingContext(clientCtx, md) clientStream, err := grpc.NewClientStream(clientCtx, clientStreamDescForProxying, backendConn, fullMethodName) if err != nil { return err diff --git a/proxy/handler_test.go b/proxy/handler_test.go index c811408..e48fb97 100644 --- a/proxy/handler_test.go +++ b/proxy/handler_test.go @@ -4,6 +4,7 @@ package proxy_test import ( + "fmt" "io" "log" "net" @@ -13,6 +14,7 @@ import ( "time" "github.com/mwitkow/grpc-proxy/proxy" + pb "github.com/mwitkow/grpc-proxy/testservice" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" @@ -21,10 +23,6 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" - - "fmt" - - pb "github.com/mwitkow/grpc-proxy/testservice" ) const (