echo icon indicating copy to clipboard operation
echo copied to clipboard

fix: Unclear behaviour of * in routes

Open iamgoroot opened this issue 7 months ago • 0 comments

This should hopefully bring more clarity into this issue https://github.com/labstack/echo/issues/2619

Examples would explain this better so here's similar to one from discussion

func main() {
	handler := func(c echo.Context) error {
		fmt.Printf("%s\n", c.Path())
		return nil
	}

	e := echo.New()
	v2 := e.Group("/v2")

	v2.DELETE("/*/blobs/:digest", handler)
	v2.GET("/*/blobs/:digest", handler)
	v2.HEAD("/*/blobs/:digest", handler)

	v2.DELETE("/*/manifests/:ref", handler)
	v2.GET("/*/manifests/:ref", handler)
	v2.HEAD("/*/manifests/:ref", handler)
	v2.PUT("/*/manifests/:ref", handler)

	v2.GET("/*/tags/list", handler)     // one wildcard
	v2.GET("/*/*/tags/list", handler)   // two wildcards
	v2.GET("/*/*/tags/list2*", handler) // two wildcards and trailing one
	v2.GET("/*/*/tags/list2", handler)  // two wildcards with fixed ending that may conflict with previous route

	v2.GET("/*/blobs/uploads/:ref", handler)
	v2.PATCH("/*/blobs/uploads/:ref", handler)
	v2.POST("/*/blobs/uploads", handler)
	v2.PUT("/*/blobs/uploads/:ref", handler)

	v2.GET("", handler)
	err := e.Start(":8080")
	if err != nil {
		panic(err)
	}
}

Example curl calls that should match those routes:

curl -ik  http://localhost:8080/v2/wildcard1/tags/list
# Matches /*/tags/list

curl -ik  http://localhost:8080/v2/wildcard1/wildcard2/tags/list
# Matches /*/*/tags/list

curl -ik  http://localhost:8080/v2/wildcard1/wildcard2/tags/list2wildcard3
# Matches /*/*/tags/list2*

curl -ik  http://localhost:8080/v2/wildcard1/wildcard2/tags/list2
# Matches /*/*/tags/list2

This one doesn't match since you would need to register it as /*/*/*/tags/list and this probably better implemented as separate ** wildcard

curl -ik  http://localhost:8080/v2/wildcard1/wildcard2/nowildcard/tags/list
{"message":"Method Not Allowed"}

iamgoroot avatar Jul 12 '24 15:07 iamgoroot