From 8467ddaa776f6871d04b5aa5dfe86c6cc72e2e7b Mon Sep 17 00:00:00 2001 From: Raphael Simon Date: Mon, 15 Jan 2024 10:32:27 -0800 Subject: [PATCH 1/2] Properly handle MapParams We can't directly reuse the code use for standard parameter mapping as it filters the query parameters keys. --- http/codegen/server.go | 26 ++++++++++++++++++- .../testdata/payload_decode_functions.go | 19 +++----------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/http/codegen/server.go b/http/codegen/server.go index dafdd4487a..8aaf4305e5 100644 --- a/http/codegen/server.go +++ b/http/codegen/server.go @@ -778,8 +778,32 @@ const requestElementsT = `{{- define "request_elements" }} {{- else if not .Required }} if len({{ .VarName }}Raw) != 0 { {{- end }} + if {{ .VarName }} == nil { + {{ .VarName }} = make({{ goTypeRef .Type }}) + } for keyRaw, valRaw := range {{ .VarName }}Raw { - {{- template "map_conversion" (mapQueryDecodeData .Type .VarName 0) }} + {{- if eq .Type.ElemType.Type.Name "string" }} + {{ .VarName }}[keyRaw] = valRaw[0] + {{- else if eq .Type.ElemType.Type.Name "array" }} + {{- if eq .Type.ElemType.Type.ElemType.Type.Name "string" }} + {{ .VarName }}[keyRaw] = valRaw + {{- else }} + var val {{ goTypeRef .Type.ElemType.Type }} + { + {{- template "slice_conversion" (conversionData "val" "query" .Type.ElemType.Type) }} + } + {{ .VarName }}[keyRaw] = val + {{- end }} + {{- else if eq .Type.ElemType.Type.Name "map" }} + {{- template "map_conversion" (mapQueryDecodeData .Type.ElemType.Type (printf "%s[keyRaw]" .VarName) 1) }} + {{- else }} + var val{{ .Loop }} {{ goTypeRef .Type.ElemType.Type }} + { + val{{ .Loop }}Raw := valRaw[0] + {{- template "type_conversion" (conversionData (printf "val%s" .Loop) "query" .Type.ElemType.Type) }} + } + {{ .VarName }}[keyRaw] = val{{ .Loop }} + {{- end }} } {{- if or .DefaultValue (not .Required) }} } diff --git a/http/codegen/testdata/payload_decode_functions.go b/http/codegen/testdata/payload_decode_functions.go index a6dccb67bf..8d7a9ccc4a 100644 --- a/http/codegen/testdata/payload_decode_functions.go +++ b/http/codegen/testdata/payload_decode_functions.go @@ -4905,22 +4905,11 @@ func DecodeMethodMapQueryObjectRequest(mux goahttp.Muxer, decoder func(*http.Req if len(cRaw) == 0 { err = goa.MergeErrors(err, goa.MissingFieldError("c", "query string")) } + if c == nil { + c = make(map[int][]string) + } for keyRaw, valRaw := range cRaw { - if c == nil { - c = make(map[int][]string) - } - var keya int - { - openIdx := strings.IndexRune(keyRaw, '[') - closeIdx := strings.IndexRune(keyRaw, ']') - keyaRaw := keyRaw[openIdx+1 : closeIdx] - v, err2 := strconv.ParseInt(keyaRaw, 10, strconv.IntSize) - if err2 != nil { - err = goa.MergeErrors(err, goa.InvalidFieldTypeError("query", keyaRaw, "integer")) - } - keya = int(v) - } - c[keya] = valRaw + c[keyRaw] = valRaw } } if err != nil { From 6332868476f7c8040a4d7885c3036d7ecf06e19d Mon Sep 17 00:00:00 2001 From: Raphael Simon Date: Mon, 15 Jan 2024 10:54:09 -0800 Subject: [PATCH 2/2] Properly convert for non-string map keys --- http/codegen/server.go | 16 +++++++++++----- .../codegen/testdata/payload_decode_functions.go | 8 +++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/http/codegen/server.go b/http/codegen/server.go index 8aaf4305e5..e8dc870709 100644 --- a/http/codegen/server.go +++ b/http/codegen/server.go @@ -782,27 +782,33 @@ const requestElementsT = `{{- define "request_elements" }} {{ .VarName }} = make({{ goTypeRef .Type }}) } for keyRaw, valRaw := range {{ .VarName }}Raw { + var key {{ goTypeRef .Type.KeyType.Type }} + {{- if eq .Type.KeyType.Type.Name "string" }} + key = keyRaw + {{- else }} + {{- template "type_conversion" (conversionData "key" "query" .Type.KeyType.Type) }} + {{- end }} {{- if eq .Type.ElemType.Type.Name "string" }} - {{ .VarName }}[keyRaw] = valRaw[0] + {{ .VarName }}[key] = valRaw[0] {{- else if eq .Type.ElemType.Type.Name "array" }} {{- if eq .Type.ElemType.Type.ElemType.Type.Name "string" }} - {{ .VarName }}[keyRaw] = valRaw + {{ .VarName }}[key] = valRaw {{- else }} var val {{ goTypeRef .Type.ElemType.Type }} { {{- template "slice_conversion" (conversionData "val" "query" .Type.ElemType.Type) }} } - {{ .VarName }}[keyRaw] = val + {{ .VarName }}[key] = val {{- end }} {{- else if eq .Type.ElemType.Type.Name "map" }} - {{- template "map_conversion" (mapQueryDecodeData .Type.ElemType.Type (printf "%s[keyRaw]" .VarName) 1) }} + {{- template "map_conversion" (mapQueryDecodeData .Type.ElemType.Type (printf "%s[key]" .VarName) 1) }} {{- else }} var val{{ .Loop }} {{ goTypeRef .Type.ElemType.Type }} { val{{ .Loop }}Raw := valRaw[0] {{- template "type_conversion" (conversionData (printf "val%s" .Loop) "query" .Type.ElemType.Type) }} } - {{ .VarName }}[keyRaw] = val{{ .Loop }} + {{ .VarName }}[key] = val{{ .Loop }} {{- end }} } {{- if or .DefaultValue (not .Required) }} diff --git a/http/codegen/testdata/payload_decode_functions.go b/http/codegen/testdata/payload_decode_functions.go index 8d7a9ccc4a..fb927e0bce 100644 --- a/http/codegen/testdata/payload_decode_functions.go +++ b/http/codegen/testdata/payload_decode_functions.go @@ -4909,7 +4909,13 @@ func DecodeMethodMapQueryObjectRequest(mux goahttp.Muxer, decoder func(*http.Req c = make(map[int][]string) } for keyRaw, valRaw := range cRaw { - c[keyRaw] = valRaw + var key int + v, err2 := strconv.ParseInt(keyRaw, 10, strconv.IntSize) + if err2 != nil { + err = goa.MergeErrors(err, goa.InvalidFieldTypeError("query", keyRaw, "integer")) + } + key = int(v) + c[key] = valRaw } } if err != nil {