Open sandersaares opened 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
FYI, x-forwarded-for is supported in the fork https://github.com/vgough/grpc-proxy
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: