server: add grpc.Method function for extracting method from context (#1961)
diff --git a/server.go b/server.go
index 0063906..c6b413b 100644
--- a/server.go
+++ b/server.go
@@ -1359,3 +1359,13 @@
}
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 a79f385..75a4e8d 100644
--- a/stream.go
+++ b/stream.go
@@ -732,9 +732,5 @@
// 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 4a76352..3df8bff 100644
--- a/test/end2end_test.go
+++ b/test/end2end_test.go
@@ -4868,6 +4868,34 @@
}
}
+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"