[Go-Server] Use ParseQuery For Parsing Query Parameters (#17585)

* Uses ParseQuery to check for malform paramater value pairs.
Runs ./mvnw clean package, ./bin/generate-samples.sh ./bin/configs/*.yaml, and ./bin/utils/export_docs_generators.sh.

* Adds missing import

* Only import url if hasQueryParams.

* Adds helper function to wrap url.ParseQuery.

* Fixes function return signature
This commit is contained in:
Gonzalo Gomez 2024-01-14 22:43:04 -07:00 committed by GitHub
parent 6518932ccf
commit af71460c86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 123 additions and 19 deletions

View File

@ -98,7 +98,11 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
{{/mux}}
{{/routers}}
{{#hasQueryParams}}
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
{{/hasQueryParams}}
{{#allParams}}
{{#isPathParam}}

View File

@ -23,6 +23,7 @@ import (
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
"strconv"
"strings"
@ -370,3 +371,9 @@ func parseNumericArrayParameter[T Number](param, delim string, required bool, fn
return values, nil
}
// parseQuery parses query paramaters and returns an error if any malformed value pairs are encountered.
func parseQuery(rawQuery string) (url.Values, error) {
return url.ParseQuery(rawQuery)
}

View File

@ -144,7 +144,11 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
// FindPetsByStatus - Finds Pets by status
func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var statusParam []string
if query.Has("status") {
statusParam = strings.Split(query.Get("status"), ",")
@ -162,7 +166,11 @@ func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Reque
// FindPetsByTags - Finds Pets by tags
// Deprecated
func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var tagsParam []string
if query.Has("tags") {
tagsParam = strings.Split(query.Get("tags"), ",")

View File

@ -172,7 +172,11 @@ func (c *UserAPIController) CreateUsersWithListInput(w http.ResponseWriter, r *h
// DeleteUser - Delete user
func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
usernameParam := chi.URLParam(r, "username")
if usernameParam == "" {
c.errorHandler(w, r, &RequiredError{"username"}, nil)
@ -221,7 +225,11 @@ func (c *UserAPIController) GetUserByName(w http.ResponseWriter, r *http.Request
// LoginUser - Logs user into the system
func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var usernameParam string
if query.Has("username") {
param := query.Get("username")

View File

@ -18,6 +18,7 @@ import (
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
"strconv"
"strings"
@ -337,3 +338,9 @@ func parseNumericArrayParameter[T Number](param, delim string, required bool, fn
return values, nil
}
// parseQuery parses query paramaters and returns an error if any malformed value pairs are encountered.
func parseQuery(rawQuery string) (url.Values, error) {
return url.ParseQuery(rawQuery)
}

View File

@ -177,7 +177,11 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
// FilterPetsByCategory - Finds Pets
func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
genderParam, err := NewGenderFromValue(params["gender"])
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
@ -218,7 +222,11 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
// FindPetsByStatus - Finds Pets by status
func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var statusParam []string
if query.Has("status") {
statusParam = strings.Split(query.Get("status"), ",")
@ -248,7 +256,11 @@ func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Reque
// FindPetsByTags - Finds Pets by tags
// Deprecated
func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var tagsParam []string
if query.Has("tags") {
tagsParam = strings.Split(query.Get("tags"), ",")
@ -356,7 +368,11 @@ func (c *PetAPIController) GetPetsByTime(w http.ResponseWriter, r *http.Request)
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var exprParam bool
if query.Has("expr") {
param, err := parseBoolParameter(
@ -415,7 +431,11 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
// SearchPet - Search Pets by filters
func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var ageParam *int64
if query.Has("age") {
param, err := parseNumericParameter[int64](

View File

@ -173,7 +173,11 @@ func (c *UserAPIController) CreateUsersWithListInput(w http.ResponseWriter, r *h
// DeleteUser - Delete user
func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
usernameParam := params["username"]
if usernameParam == "" {
c.errorHandler(w, r, &RequiredError{"username"}, nil)
@ -223,7 +227,11 @@ func (c *UserAPIController) GetUserByName(w http.ResponseWriter, r *http.Request
// LoginUser - Logs user into the system
func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var usernameParam string
if query.Has("username") {
param := query.Get("username")

View File

@ -17,6 +17,7 @@ import (
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
"strconv"
"strings"
@ -341,3 +342,9 @@ func parseNumericArrayParameter[T Number](param, delim string, required bool, fn
return values, nil
}
// parseQuery parses query paramaters and returns an error if any malformed value pairs are encountered.
func parseQuery(rawQuery string) (url.Values, error) {
return url.ParseQuery(rawQuery)
}

View File

@ -175,7 +175,11 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
// FilterPetsByCategory - Finds Pets
func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
genderParam, err := NewGenderFromValue(chi.URLParam(r, "gender"))
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
@ -215,7 +219,11 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
// FindPetsByStatus - Finds Pets by status
func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var statusParam []string
if query.Has("status") {
statusParam = strings.Split(query.Get("status"), ",")
@ -245,7 +253,11 @@ func (c *PetAPIController) FindPetsByStatus(w http.ResponseWriter, r *http.Reque
// FindPetsByTags - Finds Pets by tags
// Deprecated
func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var tagsParam []string
if query.Has("tags") {
tagsParam = strings.Split(query.Get("tags"), ",")
@ -350,7 +362,11 @@ func (c *PetAPIController) GetPetsByTime(w http.ResponseWriter, r *http.Request)
// GetPetsUsingBooleanQueryParameters - Get the pets by only using boolean query parameters
func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var exprParam bool
if query.Has("expr") {
param, err := parseBoolParameter(
@ -409,7 +425,11 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
// SearchPet - Search Pets by filters
func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var ageParam *int64
if query.Has("age") {
param, err := parseNumericParameter[int64](

View File

@ -172,7 +172,11 @@ func (c *UserAPIController) CreateUsersWithListInput(w http.ResponseWriter, r *h
// DeleteUser - Delete user
func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
usernameParam := chi.URLParam(r, "username")
if usernameParam == "" {
c.errorHandler(w, r, &RequiredError{"username"}, nil)
@ -221,7 +225,11 @@ func (c *UserAPIController) GetUserByName(w http.ResponseWriter, r *http.Request
// LoginUser - Logs user into the system
func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
query, err := parseQuery(r.URL.RawQuery)
if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
return
}
var usernameParam string
if query.Has("username") {
param := query.Get("username")

View File

@ -18,6 +18,7 @@ import (
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
"strconv"
"strings"
@ -337,3 +338,9 @@ func parseNumericArrayParameter[T Number](param, delim string, required bool, fn
return values, nil
}
// parseQuery parses query paramaters and returns an error if any malformed value pairs are encountered.
func parseQuery(rawQuery string) (url.Values, error) {
return url.ParseQuery(rawQuery)
}