Make request parser handle form-encoded content

This fixes a new signin bug
This commit is contained in:
Eli Ribble 2026-04-21 22:48:31 +00:00
parent 0ce3420792
commit baaa3bff5b
No known key found for this signature in database
2 changed files with 18 additions and 6 deletions

View file

@ -342,12 +342,24 @@ func handlerFormPost[RequestType any, ResponseType any](f handlerFunctionPostFor
}
}
func parseRequest[RequestType any](r *http.Request) (*RequestType, *nhttp.ErrorWithStatus) {
var err error
var req RequestType
body, err := io.ReadAll(r.Body)
if err != nil {
return nil, nhttp.NewError("Failed to read body: %w", err)
content_type := r.Header.Get("Content-Type")
if content_type == "application/json" {
body, e := io.ReadAll(r.Body)
if e != nil {
return nil, nhttp.NewError("Failed to read body: %w", err)
}
err = json.Unmarshal(body, &req)
} else if content_type == "application/x-www-form-urlencoded" {
e := r.ParseForm()
if err != nil {
return nil, nhttp.NewBadRequest("parsing form: %w", e)
}
err = decoder.Decode(&req, r.PostForm)
} else {
return nil, nhttp.NewBadRequest("unrecognized content type '%s'", content_type)
}
err = json.Unmarshal(body, &req)
if err != nil {
return nil, nhttp.NewErrorStatus(http.StatusBadRequest, "Failed to decode request: %w", err)
}

View file

@ -12,8 +12,8 @@ import (
)
type reqSignin struct {
Password string `json:"password"`
Username string `json:"username"`
Password string `schema:"password"`
Username string `schema:"username"`
}
func postSignin(ctx context.Context, r *http.Request, req reqSignin) (string, *nhttp.ErrorWithStatus) {