go-chi / go-chi/chi

middleware.AllowContentType not running for subroutes

Open
#785 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
22.8k
Forks
1.2k
Avg merge
5h 17m
Merged PRs (30d)
10

Description

Given this sample code

```go
package main

import (
"net/http"

"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
)

func main() {
http.ListenAndServe(":3000", GetRouter())
}

func GetRouter() *chi.Mux {
apiRouter := chi.NewRouter()

apiRouter.Route("/foo-group", func(fooGroupRouter chi.Router) {
fooGroupRouter.Use(middleware.AllowContentType("application/json"))

fooGroupRouter.Post("/sub-route", HandleRoute( /* Params */))
})

// other routes

return apiRouter
}

func HandleRoute( /* Params */) http.HandlerFunc {
return func(responseWriter http.ResponseWriter, request *http.Request) {
responseWriter.WriteHeader(http.StatusCreated)

responseWriter.Write([]byte("done"))
}
}
```

When calling the API via

> POST localhost:3000/foo-group/sub-route

I get a 201 with "done". But I want to ensure this endpoint only accepts the content type "application/json", otherwise send back a 415.

Unfortunately the middleware is not working yet. I also tried to test the behaviour with the testrunner

```go
package main

import (
"net/http"
"net/http/httptest"
"strconv"
"testing"
)

func TestHandleRoute(suite *testing.T) {
server := httptest.NewServer(HandleRoute())

suite.Run("responds with status code "+strconv.Itoa(http.StatusUnsupportedMediaType)+" if content type is not application/json", func(testing *testing.T) {
response, _ := http.Post(server.URL, "text/xml", nil)

if response.StatusCode != http.StatusUnsupportedMediaType {
testing.Errorf("Expected statuscode %d but got %d", http.StatusUnsupportedMediaType, response.StatusCode)
}
})
}
```

Unfortunately the test fails with the message

> main_test.go:17: Expected statuscode 415 but got 201

so it seems the middleware didn't run.

Is my setup wrong or is it a bug?

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the request through GetRouter rather than testing HandleRoute directly, then inspect how middleware.AllowContentType is applied to the /foo-group route. Compare responses for application/json and text/xml, and confirm that the non-JSON request returns 415 while the accepted request still reaches HandleRoute.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
api, backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.