43 lines
880 B
Go
43 lines
880 B
Go
package gapi
|
|
|
|
import (
|
|
"context"
|
|
|
|
"google.golang.org/grpc/metadata"
|
|
"google.golang.org/grpc/peer"
|
|
)
|
|
|
|
const (
|
|
grpcGatewayUserAgentHeader = "grpcgateway-user-agent"
|
|
userAgentHeader = "user-agent"
|
|
xForwardedForHeader = "x-forwarded-for"
|
|
)
|
|
|
|
type Metadata struct {
|
|
UserAgent string
|
|
ClientIP string
|
|
}
|
|
|
|
func (s *Server) extractMetadata(ctx context.Context) *Metadata {
|
|
mtdt := Metadata{}
|
|
|
|
md, ok := metadata.FromIncomingContext(ctx)
|
|
if ok {
|
|
if userAgent := md.Get(grpcGatewayUserAgentHeader); len(userAgent) > 0 {
|
|
mtdt.UserAgent = userAgent[0]
|
|
}
|
|
if userAgent := md.Get(userAgentHeader); len(userAgent) > 0 {
|
|
mtdt.UserAgent = userAgent[0]
|
|
}
|
|
if clientIPs := md.Get(xForwardedForHeader); len(clientIPs) > 0 {
|
|
mtdt.ClientIP = clientIPs[0]
|
|
}
|
|
}
|
|
|
|
if p, ok := peer.FromContext(ctx); ok {
|
|
mtdt.ClientIP = p.Addr.String()
|
|
}
|
|
|
|
return &mtdt
|
|
}
|