Причина, по которой повар ie не установлен, заключается в том, что он не был успешно проанализирован. Модуль aiohttp
опирается на http.cookies
из стандартной библиотеки и его класса SimpleCookie
.
При получении ответа его заголовки проверяются на наличие ключа Set-Cookie
, а значение, связанное с ним, равно используется для создания экземпляра SimpleCookie
. Последний имеет метод load
, который анализирует строку повара ie и извлекает информацию о поваре ie. Для этого строка cook ie сопоставляется с регулярным выражением _CookiePattern
, определенным в том же модуле в строке 434 (для тега v3.7.2
):
_CookiePattern = re.compile(r"""
\s* # Optional whitespace at start of cookie
(?P<key> # Start of group 'key'
[""" + _LegalKeyChars + r"""]+? # Any word of at least one letter
) # End of group 'key'
( # Optional group: there may not be a value.
\s*=\s* # Equal Sign
(?P<val> # Start of group 'val'
"(?:[^\\"]|\\.)*" # Any doublequoted string
| # or
\w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr
| # or
[""" + _LegalValueChars + r"""]* # Any word or empty string
) # End of group 'val'
)? # End of optional value group
\s* # Any number of spaces.
(\s+|;|$) # Ending either at space, semicolon, or EOS.
""", re.ASCII | re.VERBOSE) # re.ASCII may be removed if safe.
Из этого шаблона мы можно прочитать, что ожидаемый шаблон для атрибута expires
:
\w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT
Этот шаблон реализует (в несколько запутанном и не совсем точном, но все же коротком виде) формат даты, указанный в MDN docs .
В результате мой повар ie, чье поле expires
равно expires=Wed, 15 Jan 2020 09:45:07 -0000
, естественно игнорируется, поскольку часовой пояс выражается как -0000
, тогда как ожидается, что он будет GMT
, Кстати, вот что MDN документы говорят об этом:
GMT
Среднее время по Гринвичу. Даты HTTP всегда выражаются в GMT, а не в местном времени.
Вывод таков: мой повар ie просто уродлив. И неудивительно, что замена -0000
на GMT
работает.