diff --git a/api/api.go b/api/api.go index 8295d35..175905b 100644 --- a/api/api.go +++ b/api/api.go @@ -79,6 +79,8 @@ func NewAPI( } server.Use(middleware) + server.NoRoute(a.noRoute) + v1 := server.Group("/v1") // Add coordinator endpoints diff --git a/api/api_test.go b/api/api_test.go index e497d60..37d681e 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -40,8 +40,11 @@ type Pendinger interface { New() Pendinger } -const apiPort = "4010" -const apiURL = "http://localhost:" + apiPort + "/v1/" +const ( + apiPort = "4010" + apiIP = "http://localhost:" + apiURL = apiIP + apiPort + "/v1/" +) var SetBlockchain = ` Type: Blockchain @@ -847,6 +850,25 @@ func doBadReq(method, path string, reqBody io.Reader, expectedResponseCode int) return swagger.ValidateResponse(ctx, responseValidationInput) } +func doSimpleReq(method, endpoint string) (string, error) { + client := &http.Client{} + httpReq, err := http.NewRequest(method, endpoint, nil) + if err != nil { + return "", tracerr.Wrap(err) + } + resp, err := client.Do(httpReq) + if err != nil { + return "", tracerr.Wrap(err) + } + //nolint + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", tracerr.Wrap(err) + } + return string(body), nil +} + // test helpers func getTimestamp(blockNum int64, blocks []common.Block) time.Time { diff --git a/api/noroute.go b/api/noroute.go new file mode 100644 index 0000000..04f7cd9 --- /dev/null +++ b/api/noroute.go @@ -0,0 +1,21 @@ +package api + +import ( + "net/http" + "regexp" + + "github.com/gin-gonic/gin" +) + +func (a *API) noRoute(c *gin.Context) { + matched, _ := regexp.MatchString(`^/v[0-9]+/`, c.Request.URL.Path) + if !matched { + c.JSON(http.StatusNotFound, gin.H{ + "error": "Version not provided, please provide a valid version in the path such as v1", + }) + return + } + c.JSON(http.StatusNotFound, gin.H{ + "error": "404 page not found", + }) +} diff --git a/api/noroute_test.go b/api/noroute_test.go new file mode 100644 index 0000000..08223c1 --- /dev/null +++ b/api/noroute_test.go @@ -0,0 +1,29 @@ +package api + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNoRouteVersionNotProvided(t *testing.T) { + endpoint := apiIP + apiPort + "/" + // not using doGoodReq, bcs internally + // there is a method FindRoute that checks route and returns error + resp, err := doSimpleReq("GET", endpoint) + assert.NoError(t, err) + assert.Equal(t, + "{\"error\":\"Version not provided, please provide a valid version in the path such as v1\"}\n", + resp) +} + +func TestNoRoute(t *testing.T) { + endpoint := apiURL + // not using doGoodReq, bcs internally + // there is a method FindRoute that checks route and returns error + resp, err := doSimpleReq("GET", endpoint) + assert.NoError(t, err) + assert.Equal(t, + "{\"error\":\"404 page not found\"}\n", + resp) +} diff --git a/node/node.go b/node/node.go index 900ab1c..f756762 100644 --- a/node/node.go +++ b/node/node.go @@ -616,12 +616,6 @@ type NodeAPI struct { //nolint:golint addr string } -func handleNoRoute(c *gin.Context) { - c.JSON(http.StatusNotFound, gin.H{ - "error": "404 page not found", - }) -} - // NewNodeAPI creates a new NodeAPI (which internally calls api.NewAPI) func NewNodeAPI( addr string, @@ -631,7 +625,6 @@ func NewNodeAPI( l2db *l2db.L2DB, ) (*NodeAPI, error) { engine := gin.Default() - engine.NoRoute(handleNoRoute) engine.Use(cors.Default()) _api, err := api.NewAPI( coordinatorEndpoints, explorerEndpoints,