Skip to content

Commit c715b0a

Browse files
authored
fix(debug printer): Handle HTML encodings correctly (#530)
Signed-off-by: Alexander Dahmen <[email protected]>
1 parent c3c4765 commit c715b0a

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

internal/pkg/print/debug.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"net/http"
9+
"net/url"
910
"slices"
1011
"sort"
1112
"strings"
@@ -141,13 +142,18 @@ func BuildDebugStrFromHTTPRequest(req *http.Request, includeHeaders []string) ([
141142
return nil, fmt.Errorf("request is invalid")
142143
}
143144

144-
status := fmt.Sprintf("request to %s: %s %s", req.URL, req.Method, req.Proto)
145+
// unescape url in order to get rid of e.g. %40
146+
unescapedURL, err := url.PathUnescape(req.URL.String())
147+
if err != nil {
148+
return nil, fmt.Errorf("unescape request url: %w", err)
149+
}
150+
151+
status := fmt.Sprintf("request to %s: %s %s", unescapedURL, req.Method, req.Proto)
145152

146153
headersMap := buildHeaderMap(req.Header, includeHeaders)
147154
headers := fmt.Sprintf("request headers: %v", BuildDebugStrFromMap(headersMap))
148155

149156
var save io.ReadCloser
150-
var err error
151157

152158
save, req.Body, err = drainBody(req.Body)
153159
if err != nil {
@@ -184,13 +190,19 @@ func BuildDebugStrFromHTTPResponse(resp *http.Response, includeHeaders []string)
184190
return nil, fmt.Errorf("response is invalid")
185191
}
186192

187-
status := fmt.Sprintf("response from %s: %s %s", resp.Request.URL, resp.Proto, resp.Status)
193+
var err error
194+
// unescape url in order to get rid of e.g. %40
195+
unescapedURL, err := url.PathUnescape(resp.Request.URL.String())
196+
if err != nil {
197+
return nil, fmt.Errorf("unescape response url: %w", err)
198+
}
199+
200+
status := fmt.Sprintf("response from %s: %s %s", unescapedURL, resp.Proto, resp.Status)
188201

189202
headersMap := buildHeaderMap(resp.Header, includeHeaders)
190203
headers := fmt.Sprintf("response headers: %v", BuildDebugStrFromMap(headersMap))
191204

192205
var save io.ReadCloser
193-
var err error
194206

195207
save, resp.Body, err = drainBody(resp.Body)
196208
if err != nil {

internal/pkg/print/debug_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,28 @@ func fixtureHTTPRequest(mods ...func(req *http.Request)) *http.Request {
7878
return request
7979
}
8080

81+
func fixtureHTTPRequestUnescaped(mods ...func(req *http.Request)) *http.Request {
82+
testBody, err := json.Marshal(map[string]string{"key": "value"})
83+
if err != nil {
84+
return nil
85+
}
86+
87+
request, err := http.NewRequest("GET", "http://example.com/v2/projects?limit=50&member=User.Name%40stackit.cloud", bytes.NewReader(testBody))
88+
if err != nil {
89+
return nil
90+
}
91+
92+
request.Header.Set("Content-Type", "application/json")
93+
request.Header.Set("Accept", "application/json")
94+
request.Header.Set("Content-Length", "15")
95+
96+
for _, mod := range mods {
97+
mod(request)
98+
}
99+
100+
return request
101+
}
102+
81103
func fixtureHTTPResponse(mods ...func(resp *http.Response)) *http.Response {
82104
testBody, err := json.Marshal(map[string]string{"key": "value"})
83105
if err != nil {
@@ -402,6 +424,16 @@ func TestBuildDebugStrFromHTTPRequest(t *testing.T) {
402424
},
403425
isValid: true,
404426
},
427+
{
428+
description: "unescaped test",
429+
inputReq: fixtureHTTPRequestUnescaped(),
430+
expected: []string{
431+
"request to http://example.com/v2/projects?limit=50&[email protected]: GET HTTP/1.1",
432+
"request headers: [Accept: application/json, Content-Length: 15, Content-Type: application/json]",
433+
"request body: [key: value]",
434+
},
435+
isValid: true,
436+
},
405437
}
406438

407439
for _, tt := range tests {

0 commit comments

Comments
 (0)