net/http: return ErrNoCookie from Request.Cookie when name is ""

Request.Cookie(name string) will return the first cookie
when cookie name is "". Since readCookies in
file net/http/cookie.go at line 247 return all cookies
when second parameter is a empty string.

To fix it, Return ErrNoCookie from Request.Cookie(""),
instead of the first cookie in the request.

Fixes #53181

Change-Id: Ie623ca4c53da64ef7623a7863292a2d771f76832
GitHub-Last-Rev: 1a6903fe037b43abb6208e8f831d2e948af71737
GitHub-Pull-Request: golang/go#53183
This commit is contained in:
muyizixiu 2022-06-01 21:26:28 +08:00 committed by borisyang
parent 8a56c7742d
commit 01098cd5db
2 changed files with 44 additions and 0 deletions

View file

@ -418,6 +418,9 @@ var ErrNoCookie = errors.New("http: named cookie not present")
// If multiple cookies match the given name, only one cookie will
// be returned.
func (r *Request) Cookie(name string) (*Cookie, error) {
if name == "" {
return nil, ErrNoCookie
}
for _, c := range readCookies(r.Header, name) {
return c, nil
}

View file

@ -1177,6 +1177,47 @@ func testMultipartFile(t *testing.T, req *Request, key, expectFilename, expectCo
return f
}
// Issue 53181: verify Request.Cookie return the correct Cookie.
// Return ErrNoCookie instead of the first cookie when name is "".
func TestRequestCookie(t *testing.T) {
for _, tt := range []struct {
name string
value string
expectedErr error
}{
{
name: "foo",
value: "bar",
expectedErr: nil,
},
{
name: "",
expectedErr: ErrNoCookie,
},
} {
req, err := NewRequest("GET", "http://example.com/", nil)
if err != nil {
t.Fatal(err)
}
req.AddCookie(&Cookie{Name: tt.name, Value: tt.value})
c, err := req.Cookie(tt.name)
if err != tt.expectedErr {
t.Errorf("got %v, want %v", err, tt.expectedErr)
}
// skip if error occured.
if err != nil {
continue
}
if c.Value != tt.value {
t.Errorf("got %v, want %v", c.Value, tt.value)
}
if c.Name != tt.name {
t.Errorf("got %s, want %v", tt.name, c.Name)
}
}
}
const (
fileaContents = "This is a test file."
filebContents = "Another test file."