From 2eae9d0c740461cb0098df2005e77bf25c48817b Mon Sep 17 00:00:00 2001 From: dfawley Date: Mon, 2 Apr 2018 13:08:04 -0700 Subject: [PATCH] server: add grpc.Method function for extracting method from context (#1961) --- server.go | 10 ++++++++++ stream.go | 6 +----- test/end2end_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/server.go b/server.go index 0063906e..c6b413b9 100644 --- a/server.go +++ b/server.go @@ -1359,3 +1359,13 @@ func SetTrailer(ctx context.Context, md metadata.MD) error { } return stream.SetTrailer(md) } + +// Method returns the method string for the server context. The returned +// string is in the format of "/service/method". +func Method(ctx context.Context) (string, bool) { + s := serverTransportStreamFromContext(ctx) + if s == nil { + return "", false + } + return s.Method(), true +} diff --git a/stream.go b/stream.go index a79f385a..75a4e8d4 100644 --- a/stream.go +++ b/stream.go @@ -732,9 +732,5 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { // MethodFromServerStream returns the method string for the input stream. // The returned string is in the format of "/service/method". func MethodFromServerStream(stream ServerStream) (string, bool) { - s := serverTransportStreamFromContext(stream.Context()) - if s == nil { - return "", false - } - return s.Method(), true + return Method(stream.Context()) } diff --git a/test/end2end_test.go b/test/end2end_test.go index 4a763522..3df8bfff 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -4868,6 +4868,34 @@ func (ss *stubServer) Stop() { } } +func TestGRPCMethod(t *testing.T) { + defer leakcheck.Check(t) + var method string + var ok bool + + ss := &stubServer{ + emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) { + method, ok = grpc.Method(ctx) + return &testpb.Empty{}, nil + }, + } + if err := ss.Start(nil); err != nil { + t.Fatalf("Error starting endpoint server: %v", err) + } + defer ss.Stop() + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + if _, err := ss.client.EmptyCall(ctx, &testpb.Empty{}); err != nil { + t.Fatalf("ss.client.EmptyCall(_, _) = _, %v; want _, nil", err) + } + + if want := "/grpc.testing.TestService/EmptyCall"; !ok || method != want { + t.Fatalf("grpc.Method(_) = %q, %v; want %q, true", method, ok, want) + } +} + func TestUnaryProxyDoesNotForwardMetadata(t *testing.T) { const mdkey = "somedata"