diff --git a/decoder_test.go b/decoder_test.go index f28e805..13fedb5 100644 --- a/decoder_test.go +++ b/decoder_test.go @@ -21,6 +21,33 @@ type holder struct { } func TestDecoder(t *testing.T) { + t.Run("decode full", func(t *testing.T) { + body := strings.NewReader(`{"body1":42}`) + url := fmt.Sprintf("http://localhost/path?query1=query1val&query2=1&query2=2") + req := httptest.NewRequest("POST", url, body) + req.Header.Set("header1", "header1val") + req.AddCookie(&http.Cookie{Name: "cookie1", Value: "true"}) + req.SetPathValue("segment1", "segment1val") + + decoder := NewDecoder() + into := holder{} + err := decoder.Decode(req, &into) + require.NoError(t, err) + + _headerVal := "header1val" + expected := holder{ + Body1: 42, + Header1: &_headerVal, + Segment1: "segment1val", + Cookie1: true, + Query1: "query1val", + Query2: []int{1, 2}, + } + require.Equal(t, expected, into) + }) +} + +func TestDecoderGorillaMux(t *testing.T) { t.Run("decode full", func(t *testing.T) { body := strings.NewReader(`{"body1":42}`) url := fmt.Sprintf("http://localhost/path?query1=query1val&query2=1&query2=2") diff --git a/defaults/defaults.go b/defaults/defaults.go index a4c18cc..54f764b 100644 --- a/defaults/defaults.go +++ b/defaults/defaults.go @@ -43,15 +43,18 @@ func GetHeader(req *http.Request, key string) (string, error) { // knowing how the server mux has altered the request to let this // information resurface. func GetSegment(req *http.Request, key string) (string, error) { + if segmentVal := req.PathValue(key); segmentVal != "" { + return segmentVal, nil + } + // We need some insight into the parsing of the request path if we // want access to this information. Therefore, we expect this to be // user-supplied. As a default, we use gorilla's mux package to // fetch the right variables. - segmentVal := mux.Vars(req)[key] - if segmentVal == "" { - return "", ErrValueNotFound + if segmentVal := mux.Vars(req)[key]; segmentVal != "" { + return segmentVal, nil } - return segmentVal, nil + return "", ErrValueNotFound } // GetQueries returns the list of values that this query parameter diff --git a/examples/simple/main.go b/examples/simple/main.go index 65b5dcb..3506031 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -7,7 +7,6 @@ import ( "net/http" "github.com/apourchet/httpwrap" - "github.com/gorilla/mux" ) // ***** Type Definitions ***** @@ -156,8 +155,6 @@ func (h *PetStoreHandler) ClearStore() error { } func main() { - r := mux.NewRouter() - handler := &PetStoreHandler{pets: map[string]*Pet{}} mw := &Middlewares{} @@ -166,14 +163,15 @@ func main() { Before(mw.checkAPICreds). Finally(mw.sendResponse) - r.Handle("/pets", wrapper.Wrap(handler.AddPet)).Methods("POST") - r.Handle("/pets", wrapper.Wrap(handler.GetPets)).Methods("GET") - r.Handle("/pets/filtered", wrapper.Wrap(handler.FilterPets)).Methods("GET") - r.Handle("/pets/{name}", wrapper.Wrap(handler.GetPetByName)).Methods("GET") - r.Handle("/pets/{name}", wrapper.Wrap(handler.UpdatePet)).Methods("PUT") + router := http.NewServeMux() + router.Handle("POST /pets", wrapper.Wrap(handler.AddPet)) + router.Handle("GET /pets", wrapper.Wrap(handler.GetPets)) + router.Handle("GET /pets/filtered", wrapper.Wrap(handler.FilterPets)) + router.Handle("GET /pets/{name}", wrapper.Wrap(handler.GetPetByName)) + router.Handle("PUT /pets/{name}", wrapper.Wrap(handler.UpdatePet)) - r.Handle("/clear", wrapper.Wrap(handler.ClearStore)).Methods("POST") + router.Handle("POST /clear", wrapper.Wrap(handler.ClearStore)) - http.Handle("/", r) - log.Fatal(http.ListenAndServe(":3000", r)) + http.Handle("/", router) + log.Fatal(http.ListenAndServe(":3000", router)) } diff --git a/examples/standard/main.go b/examples/standard/main.go index 4623e0c..1b9354b 100644 --- a/examples/standard/main.go +++ b/examples/standard/main.go @@ -5,7 +5,6 @@ import ( "net/http" "github.com/apourchet/httpwrap" - "github.com/gorilla/mux" ) // ***** Type Definitions ***** @@ -125,18 +124,17 @@ func (h *PetStoreHandler) ClearStore() error { } func main() { - router := mux.NewRouter() - handler := &PetStoreHandler{pets: map[string]*Pet{}} wrapper := httpwrap.NewStandardWrapper().Before(checkAPICreds) - router.Handle("/pets", wrapper.Wrap(handler.AddPet)).Methods("POST") - router.Handle("/pets", wrapper.Wrap(handler.GetPets)).Methods("GET") - router.Handle("/pets/filtered", wrapper.Wrap(handler.FilterPets)).Methods("GET") - router.Handle("/pets/{name}", wrapper.Wrap(handler.GetPetByName)).Methods("GET") - router.Handle("/pets/{name}", wrapper.Wrap(handler.UpdatePet)).Methods("PUT") + router := http.NewServeMux() + router.Handle("POST /pets", wrapper.Wrap(handler.AddPet)) + router.Handle("GET /pets", wrapper.Wrap(handler.GetPets)) + router.Handle("GET /pets/filtered", wrapper.Wrap(handler.FilterPets)) + router.Handle("GET /pets/{name}", wrapper.Wrap(handler.GetPetByName)) + router.Handle("PUT /pets/{name}", wrapper.Wrap(handler.UpdatePet)) - router.Handle("/clear", wrapper.Wrap(handler.ClearStore)).Methods("POST") + router.Handle("POST /clear", wrapper.Wrap(handler.ClearStore)) http.Handle("/", router) log.Fatal(http.ListenAndServe(":3000", router)) diff --git a/go.mod b/go.mod index c22e781..420481a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/apourchet/httpwrap -go 1.20 +go 1.22 require ( github.com/gorilla/mux v1.7.2