Установка cookie с максимальным возрастом; максимальный возраст потерян - PullRequest
1 голос
/ 19 апреля 2019

Итак .. У меня есть этот модульный тест:

func TestCookieVoodoo(t *testing.T) {
    req := httptest.NewRequest("GET", "/", nil)

    cookie := http.Cookie{Name: "potato", MaxAge: 1000}

    req.AddCookie(&cookie)

    cookieCopy, _ := req.Cookie("potato")

    println(fmt.Sprintf("Cookie orig: %v", cookie))
    println(fmt.Sprintf("Cookie Copy: %v", *cookieCopy))

    t.Fail()
}

При его запуске вывод:

Cookie orig: {potato    0001-01-01 00:00:00 +0000 UTC  1000 false false 0  []}
Cookie copy: {potato    0001-01-01 00:00:00 +0000 UTC  0 false false 0  []}

Почему он теряет максимальный возраст? (то же самое происходит при установке других полей cookie) Спасибо

Ответы [ 3 ]

6 голосов
/ 19 апреля 2019

Поскольку Request.AddCookie только добавляет key и value к строке cookie. функция:

func (r *Request) AddCookie(c *Cookie) {
    s := fmt.Sprintf("%s=%s", sanitizeCookieName(c.Name), sanitizeCookieValue(c.Value))
    if c := r.Header.Get("Cookie"); c != "" {
        r.Header.Set("Cookie", c+"; "+s)
    } else {
        r.Header.Set("Cookie", s)
    }
}

почему

  1. это определение cookie-string в RFC 6265
  2. Max-Age и другие поля cookie используются клиентом, а не сервером. это конфиг клиента. например: если срок действия файла cookie истекает, клиент не отправляет key=value на сервер. Таким образом, поля игнорируются в запросе
3 голосов
/ 19 апреля 2019

Если вы посмотрите на код AddCookie, вы увидите, что он присоединяет заголовок Cookie к запросу в форме <Name>=<Value> или добавляет к существующему заголовку Cookie, игнорируя все остальныеполя структуры Cookie, за исключением Name и Value.

Заголовок Cookie имеет только понятия Name и Value, более подробную информацию о заголовке Cookie можно найти здесь С другой стороны, заголовок .

A Set-Cookie сохранит все поля структуры Cookie, но обычно он устанавливается на HTTP-ответ.Так что на самом деле не имеет смысла устанавливать это на http.Request.

1 голос
/ 19 апреля 2019

Рассматривая реализацию Go для AddCookie, она принимает только поля Name и Value.

Я полагаю, что это потому, что MaxAge действителен при отправке куки в Response, но не имеет значения при создании Request. Любые файлы cookie, которые клиент получает для отправки запроса (как в вашем случае), должны быть проверены; действительные файлы cookie затем добавляются с помощью AddCookie, и только их Ключи и Значения будут отправлены вместе с запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...