Skip to content

Commit

Permalink
net/http: add Request.CookiesNamed
Browse files Browse the repository at this point in the history
Implements a new method http.Request.CookiesName, that allows
retrieving all cookies that match the given name.

Fixes #61472

Change-Id: I405d8771b4195af9ff6b4dfde3cfcd316c23b70c
GitHub-Last-Rev: 6ad0094
GitHub-Pull-Request: #61473
Reviewed-on: https://go-review.googlesource.com/c/go/+/511516
Reviewed-by: Emmanuel Odeke <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
Reviewed-by: Carlos Amedee <[email protected]>
Reviewed-by: Damien Neil <[email protected]>
  • Loading branch information
timofurrer authored and odeke-em committed Mar 20, 2024
1 parent db423dd commit 6dca707
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
1 change: 1 addition & 0 deletions api/next/61472.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pkg net/http, method (*Request) CookiesNamed(string) []*Cookie #61472
9 changes: 9 additions & 0 deletions src/net/http/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,15 @@ func (r *Request) Cookies() []*Cookie {
return readCookies(r.Header, "")
}

// CookiesNamed parses and returns the named HTTP cookies sent with the request
// or an empty slice if none matched.
func (r *Request) CookiesNamed(name string) []*Cookie {
if name == "" {
return []*Cookie{}
}
return readCookies(r.Header, name)
}

// ErrNoCookie is returned by Request's Cookie method when a cookie is not found.
var ErrNoCookie = errors.New("http: named cookie not present")

Expand Down
71 changes: 71 additions & 0 deletions src/net/http/request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"context"
"crypto/rand"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
Expand Down Expand Up @@ -1256,6 +1257,76 @@ func TestRequestCookie(t *testing.T) {
}
}

func TestRequestCookiesByName(t *testing.T) {
tests := []struct {
in []*Cookie
filter string
want []*Cookie
}{
{
in: []*Cookie{
{Name: "foo", Value: "foo-1"},
{Name: "bar", Value: "bar"},
},
filter: "foo",
want: []*Cookie{{Name: "foo", Value: "foo-1"}},
},
{
in: []*Cookie{
{Name: "foo", Value: "foo-1"},
{Name: "foo", Value: "foo-2"},
{Name: "bar", Value: "bar"},
},
filter: "foo",
want: []*Cookie{
{Name: "foo", Value: "foo-1"},
{Name: "foo", Value: "foo-2"},
},
},
{
in: []*Cookie{
{Name: "bar", Value: "bar"},
},
filter: "foo",
want: []*Cookie{},
},
{
in: []*Cookie{
{Name: "bar", Value: "bar"},
},
filter: "",
want: []*Cookie{},
},
{
in: []*Cookie{},
filter: "foo",
want: []*Cookie{},
},
}

for _, tt := range tests {
t.Run(tt.filter, func(t *testing.T) {
req, err := NewRequest("GET", "http://example.com/", nil)
if err != nil {
t.Fatal(err)
}
for _, c := range tt.in {
req.AddCookie(c)
}

got := req.CookiesNamed(tt.filter)

if !reflect.DeepEqual(got, tt.want) {
asStr := func(v any) string {
blob, _ := json.MarshalIndent(v, "", " ")
return string(blob)
}
t.Fatalf("Result mismatch\n\tGot: %s\n\tWant: %s", asStr(got), asStr(tt.want))
}
})
}
}

const (
fileaContents = "This is a test file."
filebContents = "Another test file."
Expand Down

0 comments on commit 6dca707

Please sign in to comment.