Skip to content

Commit 10bbb87

Browse files
committed
Fix panic when assign to nil header and cookie when host is not found
Closes #5213 Add tests
1 parent 57f503d commit 10bbb87

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

js/modules/k6/http/response_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,15 @@ func TestResponse(t *testing.T) {
390390
assertRequestMetricsEmitted(t, metrics.GetBufferedSamples(samples), "GET", sr("HTTPBIN_URL/get"), 200, "")
391391
})
392392
})
393+
394+
t.Run("FailedRequestHeadersAndCookiesAssignment", func(t *testing.T) {
395+
_, err := rt.RunString(`
396+
var res = http.get("https://test.k6.i", { throw: false });
397+
res.headers["custom-key"] = "custom-value";
398+
if (res.headers["custom-key"] !== "custom-value") {
399+
throw new Error("Failed to assign to headers on failed request");
400+
}
401+
`)
402+
assert.NoError(t, err)
403+
})
393404
}

lib/netext/httpext/request.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,12 @@ func MakeRequest(ctx context.Context, state *lib.State, preq *ParsedHTTPRequest)
229229
transport = ntlmssp.Negotiator{RoundTripper: transport}
230230
}
231231

232-
resp := &Response{URL: preq.URL.URL, Request: respReq}
232+
resp := &Response{
233+
URL: preq.URL.URL,
234+
Request: respReq,
235+
Headers: make(map[string]string),
236+
Cookies: make(map[string][]*HTTPCookie),
237+
}
233238
client := http.Client{
234239
Transport: transport,
235240
CheckRedirect: func(req *http.Request, via []*http.Request) error {

lib/netext/httpext/request_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,51 @@ func TestMakeRequestTimeoutInTheBegining(t *testing.T) {
492492
}
493493
}
494494

495+
func TestMakeRequestFailedHostInitializesHeadersAndCookies(t *testing.T) {
496+
t.Parallel()
497+
ctx, cancel := context.WithCancel(context.Background())
498+
defer cancel()
499+
samples := make(chan metrics.SampleContainer, 10)
500+
logger := logrus.New()
501+
logger.Level = logrus.DebugLevel
502+
registry := metrics.NewRegistry()
503+
state := &lib.State{
504+
Options: lib.Options{
505+
SystemTags: &metrics.DefaultSystemTagSet,
506+
},
507+
Transport: http.DefaultTransport,
508+
Samples: samples,
509+
Logger: logger,
510+
BufferPool: lib.NewBufferPool(),
511+
BuiltinMetrics: metrics.RegisterBuiltinMetrics(registry),
512+
Tags: lib.NewVUStateTags(registry.RootTagSet()),
513+
}
514+
515+
invalidURL := "https://test.k6.i"
516+
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, invalidURL, nil)
517+
require.NoError(t, err)
518+
519+
preq := &ParsedHTTPRequest{
520+
Req: req,
521+
URL: &URL{u: req.URL, URL: invalidURL},
522+
Body: new(bytes.Buffer),
523+
Timeout: 10 * time.Second,
524+
TagsAndMeta: state.Tags.GetCurrentValues(),
525+
}
526+
527+
res, err := MakeRequest(ctx, state, preq)
528+
require.NoError(t, err)
529+
require.NotNil(t, res)
530+
531+
assert.NotNil(t, res.Headers, "Headers map should be initialized even for failed requests")
532+
assert.NotNil(t, res.Cookies, "Cookies map should be initialized even for failed requests")
533+
534+
res.Headers["test-key"] = "test-value"
535+
res.Cookies["test-cookie"] = []*HTTPCookie{{Name: "test", Value: "value"}}
536+
assert.Equal(t, "test-value", res.Headers["test-key"])
537+
assert.Equal(t, "test", res.Cookies["test-cookie"][0].Name)
538+
}
539+
495540
func TestMakeRequestRPSLimit(t *testing.T) {
496541
t.Parallel()
497542
var requests int64

lib/netext/httpext/response.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ type Response struct {
7474
// NewResponse returns an empty Response instance.
7575
func NewResponse() *Response {
7676
return &Response{
77-
Body: []byte{},
77+
Headers: make(map[string]string),
78+
Cookies: make(map[string][]*HTTPCookie),
79+
Body: []byte{},
7880
}
7981
}
8082

0 commit comments

Comments
 (0)