diff --git a/credentials/credentials.go b/credentials/credentials.go index 53707902..8d4c57cc 100644 --- a/credentials/credentials.go +++ b/credentials/credentials.go @@ -151,14 +151,16 @@ func (c *tlsCreds) ClientHandshake(addr string, rawConn net.Conn, timeout time.D errChannel <- timeoutError{} }) } + // use local cfg to avoid clobbering ServerName if using multiple endpoints + cfg := *c.config if c.config.ServerName == "" { colonPos := strings.LastIndex(addr, ":") if colonPos == -1 { colonPos = len(addr) } - c.config.ServerName = addr[:colonPos] + cfg.ServerName = addr[:colonPos] } - conn := tls.Client(rawConn, c.config) + conn := tls.Client(rawConn, &cfg) if timeout == 0 { err = conn.Handshake() } else { diff --git a/reflection/serverreflection.go b/reflection/serverreflection.go index 0daa096f..c3327ac5 100644 --- a/reflection/serverreflection.go +++ b/reflection/serverreflection.go @@ -214,7 +214,7 @@ func (s *serverReflectionServer) serviceMetadataForSymbol(name string) (interfac return nil, fmt.Errorf("unknown symbol: %v", name) } - // Search for method name in info.Methods. + // Search the method name in info.Methods. var found bool for _, m := range info.Methods { if m.Name == name[pos+1:] { diff --git a/server.go b/server.go index f7b8319b..a2b2b94d 100644 --- a/server.go +++ b/server.go @@ -245,7 +245,7 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) { s.m[sd.ServiceName] = srv } -// MethodInfo contains information about an RPC. +// MethodInfo contains the information of an RPC including its method name and type. type MethodInfo struct { // Name is the method name only, without the service name or package name. Name string @@ -320,9 +320,11 @@ func (s *Server) Serve(lis net.Listener) error { s.lis[lis] = true s.mu.Unlock() defer func() { - lis.Close() s.mu.Lock() - delete(s.lis, lis) + if s.lis != nil && s.lis[lis] { + lis.Close() + delete(s.lis, lis) + } s.mu.Unlock() }() for {