provide HandlerEndpoints #147
							
								
								
									
										50
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								http.go
									
									
									
									
									
								
							| @@ -235,6 +235,56 @@ func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOptio | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	metadata, ok := options.Context.Value(handlerEndpointsKey{}).([]EndpointMetadata) | ||||||
|  | 	if !ok { | ||||||
|  | 		return hdlr | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, md := range metadata { | ||||||
|  | 		hn := md.Name | ||||||
|  | 		var method reflect.Method | ||||||
|  | 		mname := hn[strings.Index(hn, ".")+1:] | ||||||
|  | 		for m := 0; m < tp.NumMethod(); m++ { | ||||||
|  | 			mn := tp.Method(m) | ||||||
|  | 			if mn.Name != mname { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			method = mn | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if method.Name == "" && h.opts.Logger.V(logger.ErrorLevel) { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "nil method for %s", mname) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mtype, err := prepareEndpoint(method) | ||||||
|  | 		if err != nil && h.opts.Logger.V(logger.ErrorLevel) { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "%v", err) | ||||||
|  | 			continue | ||||||
|  | 		} else if mtype == nil { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "nil mtype for %s", mname) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		rcvr := reflect.ValueOf(handler) | ||||||
|  | 		name := reflect.Indirect(rcvr).Type().Name() | ||||||
|  |  | ||||||
|  | 		pth := &patHandler{mtype: mtype, name: name, rcvr: rcvr} | ||||||
|  | 		hdlr.name = name | ||||||
|  |  | ||||||
|  | 		if err := hdlr.handlers.Insert([]string{md.Method}, md.Path, pth); err != nil { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "cant add handler for %s %s", md.Method, md.Path) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if h.registerRPC { | ||||||
|  | 			h.opts.Logger.Infof(h.opts.Context, "register rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
|  | 			if err := hdlr.handlers.Insert([]string{http.MethodPost}, "/"+hn, pth); err != nil { | ||||||
|  | 				h.opts.Logger.Errorf(h.opts.Context, "cant add rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return hdlr | 	return hdlr | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								options.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								options.go
									
									
									
									
									
								
							| @@ -133,10 +133,18 @@ func RegisterRPCHandler(b bool) server.Option { | |||||||
| 	return server.SetOption(registerRPCHandlerKey{}, b) | 	return server.SetOption(registerRPCHandlerKey{}, b) | ||||||
| } | } | ||||||
|  |  | ||||||
| type handlerMetadataKey struct{} | type handlerEndpointsKey struct{} | ||||||
|  |  | ||||||
| func HandlerMetadata(md map[string]map[string]map[string]string) server.HandlerOption { | type EndpointMetadata struct { | ||||||
| 	return server.SetHandlerOption(handlerMetadataKey{}, md) | 	Name   string | ||||||
|  | 	Path   string | ||||||
|  | 	Method string | ||||||
|  | 	Body   string | ||||||
|  | 	Stream bool | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func HandlerEndpoints(md []EndpointMetadata) server.HandlerOption { | ||||||
|  | 	return server.SetHandlerOption(handlerEndpointsKey{}, md) | ||||||
| } | } | ||||||
|  |  | ||||||
| type handlerOptions struct { | type handlerOptions struct { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user