urllib2 несколько заголовков Set-Cookie в ответ

Я использую urllib2 для взаимодействия с веб-сайтом, который отправляет несколько заголовков Set-Cookie. Однако словарь заголовка ответа содержит только один - кажется, что дубликаты ключей переопределяют друг друга.

Есть ли способ получить доступ к повторяющимся заголовкам с помощью urllib2?


person hoju    schedule 16.03.2010    source источник


Ответы (2)


Согласно документам urllib2, атрибут .headers результирующего объекта URL представляет собой httplib.HTTPMessage (который появляется быть недокументированным, по крайней мере, в документации Python).

Тем не мение,

help(httplib.HTTPMessage)
...

If multiple header fields with the same name occur, they are combined
according to the rules in RFC 2616 sec 4.2:

Appending each subsequent field-value to the first, each separated
by a comma. The order in which header fields with the same field-name
are received is significant to the interpretation of the combined
field value.

Итак, если вы обращаетесь к u.headers['Set-Cookie'], вы должны получить один заголовок Set-Cookie со значениями, разделенными запятыми.

Действительно, похоже, это так.

import httplib
from StringIO import StringIO

msg = \
"""Set-Cookie: Foo
Set-Cookie: Bar
Set-Cookie: Baz

This is the message"""

msg = StringIO(msg)

msg = httplib.HTTPMessage(msg)

assert msg['Set-Cookie'] == 'Foo, Bar, Baz'
person Jason R. Coombs    schedule 16.03.2010
comment
Рушаб: Нет, но для таких вещей, как файлы cookie, существуют библиотеки, которые обрабатывают правила RFC 2616. См. Lib/cookielib. - person Jason R. Coombs; 18.03.2011

set-cookie отличается. Из RFC 6265:

Исходным серверам НЕ СЛЕДУЕТ объединять несколько полей заголовка Set-Cookie в одно поле заголовка. Обычный механизм сворачивания полей заголовков HTTP (т. е. определенный в [RFC2616]) может изменить семантику поля заголовка Set-Cookie, поскольку символ %x2C (",") используется Set-Cookie таким образом, что это противоречит с таким складыванием.

Теоретически это выглядит как ошибка.

person Greg    schedule 06.10.2016