-
Notifications
You must be signed in to change notification settings - Fork 684
Open
Labels
v4could be part of a v4 major versioncould be part of a v4 major version
Description
When there are mix use of default webService and regexPath webService, the default webService may get biased and its route won't get selected.
with 2 webService setup like this:
- one with default routes (empty Path, or rootPath '/')
- one with regex Path
during detectWebService, computeWebserviceScore, with a request trying to hit the default route. - defaultRoute would always get score 0
- and regexPath would always get score 1 (regex not match)
this would select wrong webService 100%, and won't find the correct route.
since I have fix on this part with issue #547 and PR #549 , I would image the fix is remove the default score for any regex routeToken, but that would definitely be a breaking change.
reproduce, also here is go playground link: https://go.dev/play/p/xbpUnvAETio
package main
import (
"fmt"
"io"
"net/http/httptest"
restful "github.com/emicklei/go-restful/v3"
)
func main() {
defaultWS := new(restful.WebService) // or .Path("/")
helloWS := new(restful.WebService).Path("/{:hello}")
defaultWS.Route(defaultWS.GET("/{:robot.txt}").To(robotFile))
restful.DefaultContainer.Add(defaultWS)
helloWS.Route(helloWS.GET("/{name:*}").To(hello))
restful.DefaultContainer.Add(helloWS) // comment out this line, and robot.txt will be served
helloRequest := httptest.NewRequest("GET", "/hello/Juan", nil)
helloRespWriter := httptest.NewRecorder()
restful.DefaultContainer.ServeHTTP(helloRespWriter, helloRequest)
robotRequest := httptest.NewRequest("GET", "/robot.txt", nil)
robotRespWriter := httptest.NewRecorder()
restful.DefaultContainer.ServeHTTP(robotRespWriter, robotRequest)
fmt.Println(helloRequest.Method, helloRequest.URL.Path, "-", helloRespWriter.Result().Status, helloRespWriter.Body.String())
fmt.Println(robotRequest.Method, robotRequest.URL.Path, "-", robotRespWriter.Result().Status, robotRespWriter.Body.String())
}
func hello(req *restful.Request, resp *restful.Response) {
io.WriteString(resp, "hello "+req.PathParameter("name"))
}
func robotFile(req *restful.Request, resp *restful.Response) {
io.WriteString(resp, "User-agent: *\nDisallow: /\n")
}Metadata
Metadata
Assignees
Labels
v4could be part of a v4 major versioncould be part of a v4 major version