http/server/metadata/metadata.go (32 lines of code) (raw):

package metadata import ( "context" "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc/metadata" ) // Helper function to extract HTTP headers and put them into metadata. func extractMetadata(headerToMetadata map[string]string, req *http.Request) metadata.MD { md := metadata.Pairs() for headerName, metadataKey := range headerToMetadata { if value := req.Header.Get(headerName); value != "" { md.Append(metadataKey, value) } } return md } // Helper function to select the metadata key and returns its corresponding HTTP header key. func matchOutgoingHeader(metadataToHeader map[string]string, s string) (string, bool) { if header, ok := metadataToHeader[s]; ok { return header, true } return "", false } // NewMetadataMiddleware returns an array of ServeMuxOptions that can be used to convert incoming HTTP headers to gRPC metadata and vice versa. func NewMetadataMiddleware(headerToMetadata, metadataToHeader map[string]string) []runtime.ServeMuxOption { return []runtime.ServeMuxOption{ runtime.WithMetadata(func(ctx context.Context, req *http.Request) metadata.MD { return extractMetadata(headerToMetadata, req) }), runtime.WithOutgoingHeaderMatcher(func(s string) (string, bool) { return matchOutgoingHeader(metadataToHeader, s) }), } }