Skip to content

Commit f444f4e

Browse files
committed
#1111 allow compound query param
1 parent 8ea06fd commit f444f4e

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

core/models/payload.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func NewRequestDetailsFromHttpRequest(req *http.Request) (RequestDetails, error)
9797
Method: req.Method,
9898
Destination: strings.ToLower(req.Host),
9999
Scheme: scheme,
100-
Query: req.URL.Query(),
100+
Query: parseQuery(req.URL.RawQuery),
101101
Body: reqBody,
102102
FormData: req.PostForm,
103103
Headers: req.Header.Clone(),
@@ -320,3 +320,26 @@ func (r *ResponseDetails) ConvertToResponseDetailsViewV5() v2.ResponseDetailsVie
320320
func (this RequestDetails) GetRawQuery() string {
321321
return this.rawQuery
322322
}
323+
324+
// Similar to req.URL.Query() but allowing compound query params like qq=country=BEL;postalCode=1234;city=SomeCity;street=SomeStreet;houseNumber=25%20a
325+
func parseQuery(query string) map[string][]string {
326+
m := make(map[string][]string)
327+
for query != "" {
328+
var key string
329+
key, query, _ = strings.Cut(query, "&")
330+
if key == "" {
331+
continue
332+
}
333+
key, value, _ := strings.Cut(key, "=")
334+
key, err := url.QueryUnescape(key)
335+
if err != nil {
336+
continue
337+
}
338+
value, err = url.QueryUnescape(value)
339+
if err != nil {
340+
continue
341+
}
342+
m[key] = append(m[key], value)
343+
}
344+
return m
345+
}

core/models/payload_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,15 @@ func Test_NewRequestDetailsFromHttpRequest_SortsQueryString(t *testing.T) {
249249
Expect(requestDetails.QueryString()).To(Equal("a=a&a=b"))
250250
}
251251

252+
func Test_NewRequestDetailsFromHttpRequest_ParseCompoundQueryParam(t *testing.T) {
253+
RegisterTestingT(t)
254+
request, _ := http.NewRequest("GET", "http://test.org/?qq=country=BEL;postalCode=1234;city=SomeCity;street=SomeStreet;houseNumber=25%20a", nil)
255+
requestDetails, err := models.NewRequestDetailsFromHttpRequest(request)
256+
Expect(err).To(BeNil())
257+
258+
Expect(requestDetails.Query["qq"]).To(ContainElement("country=BEL;postalCode=1234;city=SomeCity;street=SomeStreet;houseNumber=25 a"))
259+
}
260+
252261
func Test_NewRequestDetailsFromHttpRequest_WithFormDataHavingNonEmptyBody(t *testing.T) {
253262
RegisterTestingT(t)
254263
form := url.Values{}

0 commit comments

Comments
 (0)