grpc-proxy icon indicating copy to clipboard operation
grpc-proxy copied to clipboard

X-Forwarded-For support

Open sandersaares opened this issue 7 years ago • 2 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.

sandersaares avatar Oct 24 '18 11:10 sandersaares

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

ghost avatar May 17 '19 12:05 ghost

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

vgough avatar Dec 08 '19 06:12 vgough