mwitkow / grpc-proxy

gRPC proxy is a Go reverse proxy that allows for rich routing of gRPC calls with minimum overhead.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

X-Forwarded-For support

sandersaares opened this issue · comments

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.

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

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