mwitkow / grpc-proxy

gRPC proxy is a Go reverse proxy that allows for rich routing of gRPC calls with minimum overhead.
Apache License 2.0
945 stars 208 forks source link

X-Forwarded-For support #37

Open sandersaares opened 5 years ago

sandersaares commented 5 years ago

I request support for X-Forwarded-For style information about the original client (I wish to know the IP address). I see a comment in the code also expressing this as a todo:

// TODO(mwitkow): Add a forwarded header to metadata, https://en.wikipedia.org/wiki/X-Forwarded-For.

ghost commented 5 years ago

I have this in my interceptor:

mdIn, _ := metadata.FromIncomingContext(ctx)

        // requests going through the grpc gateway will have "pipe" as peer address.
        // so we will first look for grpc headers, if they are not present we consider
        // the request as direct gRPC request and take address from the peer.
        // if we cannot determine the hostname, we will return error.
        var hostname string

        if headerVals := mdIn.Get("x-forwarded-for"); len(headerVals) > 0 {
            hostname = headerVals[0]
        }

        if hostname == "" {
            if p, ok := peer.FromContext(ctx); ok {
                hostname = p.Addr.String()
            }
        }

        if hostname == "" {
            return nil, status.Error(codes.Unauthenticated, "no peer found")
        }

        // remove port from the hostname
        if host, _, err := net.SplitHostPort(hostname); err == nil {
            hostname = host
        }

should be just a matter of adding the forwarded header and calling metadata.NewIncomingContext

vgough commented 4 years ago

FYI, x-forwarded-for is supported in the fork https://github.com/vgough/grpc-proxy