From a25f6e549c93d85c80df9eb255cb22b06d9d0ea3 Mon Sep 17 00:00:00 2001 From: Easwar Swaminathan Date: Wed, 19 May 2021 18:04:34 -0700 Subject: [PATCH] server: return UNIMPLEMENTED on receipt of malformed method name --- server.go | 2 +- test/end2end_test.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/server.go b/server.go index 0a151dee4fc..cf12676f7df 100644 --- a/server.go +++ b/server.go @@ -1588,7 +1588,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str trInfo.tr.SetError() } errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) - if err := t.WriteStatus(stream, status.New(codes.ResourceExhausted, errDesc)); err != nil { + if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { if trInfo != nil { trInfo.tr.LazyLog(&fmtStringer{"%v", []interface{}{err}}, true) trInfo.tr.SetError() diff --git a/test/end2end_test.go b/test/end2end_test.go index 76ff07a27c2..ca22fed1ad8 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -6292,6 +6292,23 @@ func testServiceConfigMaxMsgSizeTD(t *testing.T, e env) { } } +// TestMalformedStreamMethod starts a test server and sends an RPC with a +// malformed method name. The server should respond with an UNIMPLEMENTED status +// code in this case. +func (s) TestMalformedStreamMethod(t *testing.T) { + const testMethod = "a-method-name-without-any-slashes" + te := newTest(t, tcpClearRREnv) + te.startServer(nil) + defer te.tearDown() + + ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) + defer cancel() + err := te.clientConn().Invoke(ctx, testMethod, nil, nil) + if gotCode := status.Code(err); gotCode != codes.Unimplemented { + t.Fatalf("Invoke with method %q, got code %s, want %s", testMethod, gotCode, codes.Unimplemented) + } +} + func (s) TestMethodFromServerStream(t *testing.T) { const testMethod = "/package.service/method" e := tcpClearRREnv