diff --git a/reflection/serverreflection.go b/reflection/serverreflection.go index b044a3a8..0daa096f 100644 --- a/reflection/serverreflection.go +++ b/reflection/serverreflection.go @@ -214,19 +214,19 @@ func (s *serverReflectionServer) serviceMetadataForSymbol(name string) (interfac return nil, fmt.Errorf("unknown symbol: %v", name) } - // Search for method in info. + // Search for method name in info.Methods. var found bool for _, m := range info.Methods { - if m == name[pos+1:] { + if m.Name == name[pos+1:] { found = true break } } - if !found { - return nil, fmt.Errorf("unknown symbol: %v", name) + if found { + return info.Metadata, nil } - return info.Metadata, nil + return nil, fmt.Errorf("unknown symbol: %v", name) } // fileDescEncodingContainingSymbol finds the file descriptor containing the given symbol, diff --git a/reflection/serverreflection_test.go b/reflection/serverreflection_test.go index aeb31e14..ca9610e2 100644 --- a/reflection/serverreflection_test.go +++ b/reflection/serverreflection_test.go @@ -273,6 +273,7 @@ func testFileContainingSymbol(t *testing.T, stream rpb.ServerReflection_ServerRe }{ {"grpc.testing.SearchService", fdTestByte}, {"grpc.testing.SearchService.Search", fdTestByte}, + {"grpc.testing.SearchService.StreamingSearch", fdTestByte}, {"grpc.testing.SearchResponse", fdTestByte}, {"grpc.testing.ToBeExtened", fdProto2Byte}, } { diff --git a/server.go b/server.go index 7dabfc64..f7b8319b 100644 --- a/server.go +++ b/server.go @@ -245,10 +245,19 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) { s.m[sd.ServiceName] = srv } -// ServiceInfo contains method names and metadata for a service. +// MethodInfo contains information about an RPC. +type MethodInfo struct { + // Name is the method name only, without the service name or package name. + Name string + // IsClientStream indicates whether the RPC is a client streaming RPC. + IsClientStream bool + // IsServerStream indicates whether the RPC is a server streaming RPC. + IsServerStream bool +} + +// ServiceInfo contains unary RPC method info, streaming RPC methid info and metadata for a service. type ServiceInfo struct { - // Methods are method names only, without the service name or package name. - Methods []string + Methods []MethodInfo // Metadata is the metadata specified in ServiceDesc when registering service. Metadata interface{} } @@ -258,12 +267,20 @@ type ServiceInfo struct { func (s *Server) GetServiceInfo() map[string]*ServiceInfo { ret := make(map[string]*ServiceInfo) for n, srv := range s.m { - methods := make([]string, 0, len(srv.md)+len(srv.sd)) + methods := make([]MethodInfo, 0, len(srv.md)+len(srv.sd)) for m := range srv.md { - methods = append(methods, m) + methods = append(methods, MethodInfo{ + Name: m, + IsClientStream: false, + IsServerStream: false, + }) } - for m := range srv.sd { - methods = append(methods, m) + for m, d := range srv.sd { + methods = append(methods, MethodInfo{ + Name: m, + IsClientStream: d.ClientStreams, + IsServerStream: d.ServerStreams, + }) } ret[n] = &ServiceInfo{ diff --git a/server_test.go b/server_test.go index 7c1e54dd..eb598a51 100644 --- a/server_test.go +++ b/server_test.go @@ -79,7 +79,7 @@ func TestGetServiceInfo(t *testing.T) { { StreamName: "EmptyStream", Handler: nil, - ServerStreams: true, + ServerStreams: false, ClientStreams: true, }, }, @@ -92,10 +92,17 @@ func TestGetServiceInfo(t *testing.T) { info := server.GetServiceInfo() want := map[string]*ServiceInfo{ "grpc.testing.EmptyService": &ServiceInfo{ - Methods: []string{ - "EmptyCall", - "EmptyStream", - }, + Methods: []MethodInfo{ + MethodInfo{ + Name: "EmptyCall", + IsClientStream: false, + IsServerStream: false, + }, + MethodInfo{ + Name: "EmptyStream", + IsClientStream: true, + IsServerStream: false, + }}, Metadata: []int{0, 2, 1, 3}, }, }