Хитрость здесь в том, чтобы использовать пользовательский сопоставитель входящего заголовка . В исходном коде или в grpc-gatway вы можете видеть, что существует WithIncomingHeaderMatcher , который преобразует входящие HTTP-заголовки в метаданные, передаваемые в контекст (позже используемый обработчиками сервера gRPC). По умолчанию он поддерживает набор так называемых постоянных HTTP-заголовков , которые передаются как есть (например, заголовок Authorization
будет отображаться как Authorization
в контексте), или вам нужно добавить префикс Ваши пользовательские заголовки с определенным префиксом, Grpc-Metadata- , см. его использование здесь . В этом случае HTTP-заголовок Grpc-Metadata-Your-Name
будет отображаться как поле Your-Name
в метаданных.
Опять же, если это слишком проблематично для вас и для вас, чтобы иметь возможность пройти, например. X-User-Id
или любые другие отформатированные заголовки в вашем приложении, вам нужно настроить пользовательское сопоставление заголовков. Я бы порекомендовал обрабатывать ваши заголовки явно, а затем переходить к стандартному (отлично работает, если вы затем обновите свои зависимости и добавите новый permanentHTTPHeader
:
func headerMatcher(header string) (string, bool) {
if header == "X-User-Id" {
return "x-user-id", true
}
return runtime.DefaultHeaderMatcher(header)
}
Надеюсь, это поможет!