aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Bendersky <eliben@golang.org>2021-09-14 15:02:55 -0700
committerRob Pike <r@golang.org>2021-09-18 06:04:41 +0000
commitc894b442d1e5e150ad33fa3ce13dbfab1c037b3a (patch)
tree1ece4f50b5d544bbc9935587a43d713e9b113de7
parent4b654c0eeca65ffc6588ffd9c99387a7e48002c1 (diff)
downloadgo-c894b442d1e5e150ad33fa3ce13dbfab1c037b3a.tar.gz
go-c894b442d1e5e150ad33fa3ce13dbfab1c037b3a.zip
net/rpc: remove warnings on incompatible methods at registration
When registering an RPC server, the type being registered may have additional methods that are not meant to be exposed as RPC endpoints. Remove the warnings net/rpc produces in this case. The functionality to report warnings is kept in the code with a compile-time constant that can be enabled for debugging. The documentation of net/rpc states that only methods satisfying a set of criteria will be made available, while other methods will be ignored. Fixes #19957 Change-Id: I5f8a148b4be1fdfffb2cd2029871193eaf24b751 Reviewed-on: https://go-review.googlesource.com/c/go/+/350009 Reviewed-by: Daniel Lublin <daniel@lublin.se> Reviewed-by: Damien Neil <dneil@google.com> Trust: Carlos Amedee <carlos@golang.org>
-rw-r--r--src/net/rpc/server.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/net/rpc/server.go b/src/net/rpc/server.go
index 074c5b9b0d..bfc19ac97c 100644
--- a/src/net/rpc/server.go
+++ b/src/net/rpc/server.go
@@ -231,6 +231,10 @@ func (server *Server) RegisterName(name string, rcvr interface{}) error {
return server.register(rcvr, name, true)
}
+// logRegisterError specifies whether to log problems during method registration.
+// To debug registration, recompile the package with this set to true.
+const logRegisterError = false
+
func (server *Server) register(rcvr interface{}, name string, useName bool) error {
s := new(service)
s.typ = reflect.TypeOf(rcvr)
@@ -252,7 +256,7 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro
s.name = sname
// Install the methods
- s.method = suitableMethods(s.typ, true)
+ s.method = suitableMethods(s.typ, logRegisterError)
if len(s.method) == 0 {
str := ""
@@ -274,9 +278,9 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro
return nil
}
-// suitableMethods returns suitable Rpc methods of typ, it will report
-// error using log if reportErr is true.
-func suitableMethods(typ reflect.Type, reportErr bool) map[string]*methodType {
+// suitableMethods returns suitable Rpc methods of typ. It will log
+// errors if logErr is true.
+func suitableMethods(typ reflect.Type, logErr bool) map[string]*methodType {
methods := make(map[string]*methodType)
for m := 0; m < typ.NumMethod(); m++ {
method := typ.Method(m)
@@ -288,7 +292,7 @@ func suitableMethods(typ reflect.Type, reportErr bool) map[string]*methodType {
}
// Method needs three ins: receiver, *args, *reply.
if mtype.NumIn() != 3 {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: method %q has %d input parameters; needs exactly three\n", mname, mtype.NumIn())
}
continue
@@ -296,7 +300,7 @@ func suitableMethods(typ reflect.Type, reportErr bool) map[string]*methodType {
// First arg need not be a pointer.
argType := mtype.In(1)
if !isExportedOrBuiltinType(argType) {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: argument type of method %q is not exported: %q\n", mname, argType)
}
continue
@@ -304,28 +308,28 @@ func suitableMethods(typ reflect.Type, reportErr bool) map[string]*methodType {
// Second arg must be a pointer.
replyType := mtype.In(2)
if replyType.Kind() != reflect.Ptr {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: reply type of method %q is not a pointer: %q\n", mname, replyType)
}
continue
}
// Reply type must be exported.
if !isExportedOrBuiltinType(replyType) {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: reply type of method %q is not exported: %q\n", mname, replyType)
}
continue
}
// Method needs one out.
if mtype.NumOut() != 1 {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: method %q has %d output parameters; needs exactly one\n", mname, mtype.NumOut())
}
continue
}
// The return type of the method must be error.
if returnType := mtype.Out(0); returnType != typeOfError {
- if reportErr {
+ if logErr {
log.Printf("rpc.Register: return type of method %q is %q, must be error\n", mname, returnType)
}
continue