Merge pull request #128 from unistack-org/util_http_method_not_allowed
util/http: trie support method not allowed
This commit was merged in pull request #128.
	This commit is contained in:
		
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ module go.unistack.org/micro-server-http/v3 | |||||||
| go 1.16 | go 1.16 | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	go.unistack.org/micro/v3 v3.9.17 | 	go.unistack.org/micro/v3 v3.9.18 | ||||||
| 	golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e | 	golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							| @@ -74,8 +74,8 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ | |||||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||||
| go.unistack.org/micro-proto/v3 v3.3.1 h1:nQ0MtWvP2G3QrpOgawVOPhpZZYkq6umTGDqs8FxJYIo= | go.unistack.org/micro-proto/v3 v3.3.1 h1:nQ0MtWvP2G3QrpOgawVOPhpZZYkq6umTGDqs8FxJYIo= | ||||||
| go.unistack.org/micro-proto/v3 v3.3.1/go.mod h1:cwRyv8uInM2I7EbU7O8Fx2Ls3N90Uw9UCCcq4olOdfE= | go.unistack.org/micro-proto/v3 v3.3.1/go.mod h1:cwRyv8uInM2I7EbU7O8Fx2Ls3N90Uw9UCCcq4olOdfE= | ||||||
| go.unistack.org/micro/v3 v3.9.17 h1:EJ9/XR9OTo/up/3aqWjaKS2YsWMA66b0dx+pc/0vIl8= | go.unistack.org/micro/v3 v3.9.18 h1:FNsCCJJKyyP9gScc1K3HxGxFjub+c4ZQpL+QwVvIMro= | ||||||
| go.unistack.org/micro/v3 v3.9.17/go.mod h1:gI4RkJKHLPW7KV6h4+ZBOZD997MRvFRXMPQIHpozikI= | go.unistack.org/micro/v3 v3.9.18/go.mod h1:gI4RkJKHLPW7KV6h4+ZBOZD997MRvFRXMPQIHpozikI= | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								handler.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								handler.go
									
									
									
									
									
								
							| @@ -62,7 +62,7 @@ func (h *httpHandler) Options() server.HandlerOptions { | |||||||
|  |  | ||||||
| func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||||
| 	// check for http.HandlerFunc handlers | 	// check for http.HandlerFunc handlers | ||||||
| 	if ph, _, ok := h.pathHandlers.Search(r.Method, r.URL.Path); ok { | 	if ph, _, err := h.pathHandlers.Search(r.Method, r.URL.Path); err == nil { | ||||||
| 		ph.(http.HandlerFunc)(w, r) | 		ph.(http.HandlerFunc)(w, r) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -106,8 +106,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
|  |  | ||||||
| 	for _, shdlr := range h.handlers { | 	for _, shdlr := range h.handlers { | ||||||
| 		hdlr := shdlr.(*httpHandler) | 		hdlr := shdlr.(*httpHandler) | ||||||
| 		fh, mp, ok := hdlr.handlers.Search(r.Method, path) | 		fh, mp, err := hdlr.handlers.Search(r.Method, path) | ||||||
| 		if ok { | 		if err == nil { | ||||||
| 			match = true | 			match = true | ||||||
| 			for k, v := range mp { | 			for k, v := range mp { | ||||||
| 				matches[k] = v | 				matches[k] = v | ||||||
| @@ -115,6 +115,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 			hldr = fh.(*patHandler) | 			hldr = fh.(*patHandler) | ||||||
| 			handler = hdlr | 			handler = hdlr | ||||||
| 			break | 			break | ||||||
|  | 		} else if err == rhttp.ErrMethodNotAllowed && !h.registerRPC { | ||||||
|  | 			h.errorHandler(ctx, nil, w, r, fmt.Errorf("not matching route found"), http.StatusNotFound) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -125,8 +127,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 			if len(serviceMethod) == 2 { | 			if len(serviceMethod) == 2 { | ||||||
| 				if shdlr, ok := h.handlers[serviceMethod[0]]; ok { | 				if shdlr, ok := h.handlers[serviceMethod[0]]; ok { | ||||||
| 					hdlr := shdlr.(*httpHandler) | 					hdlr := shdlr.(*httpHandler) | ||||||
| 					fh, mp, ok := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) | 					fh, mp, err := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) | ||||||
| 					if ok { | 					if err == nil { | ||||||
| 						match = true | 						match = true | ||||||
| 						for k, v := range mp { | 						for k, v := range mp { | ||||||
| 							matches[k] = v | 							matches[k] = v | ||||||
| @@ -216,7 +218,7 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
|  |  | ||||||
| 	// define the handler func | 	// define the handler func | ||||||
| 	fn := func(fctx context.Context, req server.Request, rsp interface{}) (err error) { | 	fn := func(fctx context.Context, req server.Request, rsp interface{}) (err error) { | ||||||
| 		returnValues = function.Call([]reflect.Value{hldr.rcvr, hldr.mtype.prepareContext(fctx), reflect.ValueOf(argv.Interface()), reflect.ValueOf(rsp)}) | 		returnValues = function.Call([]reflect.Value{hldr.rcvr, hldr.mtype.prepareContext(fctx), argv, reflect.ValueOf(rsp)}) | ||||||
|  |  | ||||||
| 		// The return value for the method is an error. | 		// The return value for the method is an error. | ||||||
| 		if rerr := returnValues[0].Interface(); rerr != nil { | 		if rerr := returnValues[0].Interface(); rerr != nil { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user