func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { md, ok := metadata.FromContext(ctx) if ok { if err := grpc.SendHeader(ctx, md); err != nil { grpclog.Fatalf("grpc.SendHeader(%v, %v) = %v, want %v", ctx, md, err, nil) } grpc.SetTrailer(ctx, md) } if s.security != "" { // Check Auth info authInfo, ok := credentials.FromContext(ctx) if !ok { grpclog.Fatalf("Failed to get AuthInfo from ctx.") } var authType string switch info := authInfo.(type) { case credentials.TLSInfo: authType = info.AuthType() default: grpclog.Fatalf("Unknown AuthInfo type") } if authType != s.security { grpclog.Fatalf("Wrong auth type: got %q, want %q", authType, s.security) } } // Simulate some service delay. time.Sleep(time.Second) return &testpb.SimpleResponse{ Payload: newPayload(in.GetResponseType(), in.GetResponseSize()), }, nil }
func (s *server) SayHello(ctx context.Context, in *echo.EchoRequest) (*echo.EchoReply, error) { log.Println("Got rpc: --> ", in.Name) log.Println(ctx) md, ok := metadata.FromContext(ctx) if ok { // authorization header from context for oauth2 at client. // Verify as access_token to oauth2/tokeninfo // https://developers.google.com/identity/protocols/OAuth2UserAgent#tokeninfo-validation // https://developers.google.com/identity/protocols/OAuth2ServiceAccount // ----------------------------------------------------------------------------- // or if the id_token is sent in, verify digital signature // https://developers.google.com/identity/protocols/OpenIDConnect?hl=en#validatinganidtoken // https://github.com/golang/oauth2/issues/127 // http://stackoverflow.com/questions/26159658/golang-token-validation-error/26287613#26287613 log.Println(md["authorization"]) //log.Println(md["sal"]) } var respmdheader = metadata.MD{ "rpc headerKey": []string{"val"}, } if err := grpc.SendHeader(ctx, respmdheader); err != nil { log.Fatalf("grpc.SendHeader(%v, %v) = %v, want %v", ctx, respmdheader, err, nil) } var respmdfooter = metadata.MD{ "rpc trailerkey": []string{"val"}, } grpc.SetTrailer(ctx, respmdfooter) return &echo.EchoReply{Message: "Hello " + in.Name}, nil }
func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) { if md, ok := metadata.FromContext(ctx); ok { // For testing purpose, returns an error if there is attached metadata other than // the user agent set by the client application. if _, ok := md["user-agent"]; !ok { return nil, grpc.Errorf(codes.DataLoss, "got extra metadata") } grpc.SendHeader(ctx, metadata.Pairs("ua", md["user-agent"])) } return new(testpb.Empty), nil }
func (s *echoServer) EchoBody(ctx context.Context, msg *examples.SimpleMessage) (*examples.SimpleMessage, error) { glog.Info(msg) grpc.SendHeader(ctx, metadata.New(map[string]string{ "foo": "foo1", "bar": "bar1", })) grpc.SetTrailer(ctx, metadata.New(map[string]string{ "foo": "foo2", "bar": "bar2", })) return msg, nil }
func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { md, ok := metadata.FromContext(ctx) if ok { if err := grpc.SendHeader(ctx, md); err != nil { grpclog.Fatalf("grpc.SendHeader(%v, %v) = %v, want %v", ctx, md, err, nil) } grpc.SetTrailer(ctx, md) } // Simulate some service delay. time.Sleep(time.Second) return &testpb.SimpleResponse{ Payload: newPayload(in.GetResponseType(), in.GetResponseSize()), }, nil }
// Send is a high level function that: // * converts error to GRPC error // * attaches debug metadata to existing metadata if possible // * sends the header to GRPC func Send(ctx context.Context, err error) error { meta, ok := metadata.FromContext(ctx) if !ok { meta = metadata.New(nil) } if trace.IsDebug() { SetDebugInfo(err, meta) } if len(meta) != 0 { sendErr := grpc.SendHeader(ctx, meta) if sendErr != nil { return trace.NewAggregate(err, sendErr) } } return ToGRPC(err) }
func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { md, ok := metadata.FromContext(ctx) if ok { if err := grpc.SendHeader(ctx, md); err != nil { return nil, grpc.Errorf(grpc.Code(err), "grpc.SendHeader(_, %v) = %v, want <nil>", md, err) } if err := grpc.SetTrailer(ctx, testTrailerMetadata); err != nil { return nil, grpc.Errorf(grpc.Code(err), "grpc.SetTrailer(_, %v) = %v, want <nil>", testTrailerMetadata, err) } } if in.Id == errorID { return nil, fmt.Errorf("got error id: %v", in.Id) } return &testpb.SimpleResponse{Id: in.Id}, nil }
func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { md, ok := metadata.FromContext(ctx) if ok { if err := grpc.SendHeader(ctx, md); err != nil { return nil, fmt.Errorf("grpc.SendHeader(%v, %v) = %v, want %v", ctx, md, err, nil) } grpc.SetTrailer(ctx, md) } pr, ok := peer.FromContext(ctx) if !ok { return nil, fmt.Errorf("failed to get peer from ctx") } if pr.Addr == net.Addr(nil) { return nil, fmt.Errorf("failed to get peer address") } if s.security != "" { // Check Auth info var authType, serverName string switch info := pr.AuthInfo.(type) { case credentials.TLSInfo: authType = info.AuthType() serverName = info.State.ServerName default: return nil, fmt.Errorf("Unknown AuthInfo type") } if authType != s.security { return nil, fmt.Errorf("Wrong auth type: got %q, want %q", authType, s.security) } if serverName != "x.test.youtube.com" { return nil, fmt.Errorf("Unknown server name %q", serverName) } } // Simulate some service delay. time.Sleep(time.Second) payload, err := newPayload(in.GetResponseType(), in.GetResponseSize()) if err != nil { return nil, err } return &testpb.SimpleResponse{ Payload: payload, }, nil }
func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *sub2.IdMessage) (*examples.ABitOfEverything, error) { s.m.Lock() defer s.m.Unlock() glog.Info(msg) err := grpc.SendHeader(ctx, metadata.New(map[string]string{ "uuid": msg.Uuid, })) if err != nil { return nil, err } if a, ok := s.v[msg.Uuid]; ok { return a, nil } grpc.SetTrailer(ctx, metadata.New(map[string]string{ "foo": "foo2", "bar": "bar2", })) return nil, grpc.Errorf(codes.NotFound, "not found") }
func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { status := in.GetResponseStatus() if md, ok := metadata.FromContext(ctx); ok { if initialMetadata, ok := md[initialMetadataKey]; ok { header := metadata.Pairs(initialMetadataKey, initialMetadata[0]) grpc.SendHeader(ctx, header) } if trailingMetadata, ok := md[trailingMetadataKey]; ok { trailer := metadata.Pairs(trailingMetadataKey, trailingMetadata[0]) grpc.SetTrailer(ctx, trailer) } } if status != nil && *status.Code != 0 { return nil, grpc.Errorf(codes.Code(*status.Code), *status.Message) } pl, err := serverNewPayload(in.GetResponseType(), in.GetResponseSize()) if err != nil { return nil, err } return &testpb.SimpleResponse{ Payload: pl, }, nil }
func (s *server) SayHelloStream(in *echo.EchoRequest, stream echo.EchoServer_SayHelloStreamServer) error { log.Println("Got stream: --> ") ctx := stream.Context() log.Println(ctx) var respmdheader = metadata.MD{ "stream headerKey": []string{"val"}, } if err := grpc.SendHeader(ctx, respmdheader); err != nil { log.Fatalf("grpc.SendHeader(%v, %v) = %v, want %v", ctx, respmdheader, err, nil) } stream.Send(&echo.EchoReply{Message: "Msg1 " + in.Name}) stream.Send(&echo.EchoReply{Message: "Msg2 " + in.Name}) var respmdfooter = metadata.MD{ "stream trailerkey": []string{"val"}, } grpc.SetTrailer(ctx, respmdfooter) return nil }
func (s *assertingService) Ping(ctx context.Context, ping *pb.PingRequest) (*pb.PingResponse, error) { // Send user trailers and headers. grpc.SendHeader(ctx, metadata.Pairs(serverHeaderMdKey, "I like turtles.")) grpc.SetTrailer(ctx, metadata.Pairs(serverTrailerMdKey, "I like ending turtles.")) return &pb.PingResponse{Value: ping.Value, Counter: 42}, nil }