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 }