Skip to content

Commit dd67ea6

Browse files
committed
fix(debug printer): Handle HTML encodings correctly
Signed-off-by: Alexander Dahmen <[email protected]>
1 parent 6100860 commit dd67ea6

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

internal/pkg/print/debug.go

Lines changed: 16 additions & 4 deletions
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 %40
146+
unescapedURL, err := url.PathUnescape(req.URL.String())
147+
if err != nil {
148+
return nil, fmt.Errorf("request url could not be unescaped: %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 %40
195+
unescapedURL, err := url.PathUnescape(resp.Request.URL.String())
196+
if err != nil {
197+
return nil, fmt.Errorf("response url could not be unescaped: %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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,29 @@ 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+
//http://example.com
88+
request, err := http.NewRequest("GET", "http://example.com/v2/projects?limit=50&member=User.Name%40stackit.cloud", bytes.NewReader(testBody))
89+
if err != nil {
90+
return nil
91+
}
92+
93+
request.Header.Set("Content-Type", "application/json")
94+
request.Header.Set("Accept", "application/json")
95+
request.Header.Set("Content-Length", "15")
96+
97+
for _, mod := range mods {
98+
mod(request)
99+
}
100+
101+
return request
102+
}
103+
81104
func fixtureHTTPResponse(mods ...func(resp *http.Response)) *http.Response {
82105
testBody, err := json.Marshal(map[string]string{"key": "value"})
83106
if err != nil {
@@ -402,6 +425,16 @@ func TestBuildDebugStrFromHTTPRequest(t *testing.T) {
402425
},
403426
isValid: true,
404427
},
428+
{
429+
description: "unescaped test",
430+
inputReq: fixtureHTTPRequestUnescaped(),
431+
expected: []string{
432+
"request to http://example.com/v2/projects?limit=50&[email protected]: GET HTTP/1.1",
433+
"request headers: [Accept: application/json, Content-Length: 15, Content-Type: application/json]",
434+
"request body: [key: value]",
435+
},
436+
isValid: true,
437+
},
405438
}
406439

407440
for _, tt := range tests {

0 commit comments

Comments
 (0)