我一直在尝试在服务器流拦截器上设置元数据,以便实际的 RPC 函数可以在下游读取它们:
func UserIDInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
ss.SendHeader(metadata.New(map[string]string{"X-User-Id": "real_user_id"}))
return handler(srv, ss)
}
func (server *Server) GetObjects(req *iam.GetObjectsRequest, client iam.Service_GetObjectsServer) error {
ctx := client.Context()
userID, ok := HeaderFromMetadata(ctx, "X-User-Id")
log.Printf("User ID: %s, Ok: %t\n", userID, ok)
return nil
}
func HeaderFromMetadata(ctx context.Context, headers ...string) (string, bool) {
meta, ok := metadata.FromIncomingContext(ctx)
if !ok {
return "", false
}
for _, header := range headers {
if value := meta.Get(header); len(value) > 0 …Run Code Online (Sandbox Code Playgroud)