Запросы Python объединяют заголовки ответов Set-Cookie.

Я использую бессерверное приложение Python, которое действует как прокси. Под капотом прокси использует библиотеку requests для инициирования запроса к целевому ресурсу, захватывает ответ и возвращает обратно вызывающему. Однако я замечаю странное поведение. Мой целевой ресурс выдает 2 файла cookie — ответ содержит два заголовка Set-Cookie с полезной нагрузкой файла cookie. Но ответ в моем коде Python на самом деле содержит один заголовок Set-Cookie с обоими файлами cookie, разделенными ", ".

import requests 

response = requests.get('https://github.com') 
print(response.headers.get('Set-Cookie'))
# _gh_sess=XX; Path=/; HttpOnly; Secure; SameSite=Lax, _octo=XXX; Path=/; Domain=github.com; Expires=Wed, 03 Nov 2021 11:52:55 GMT; Secure; SameSite=Lax, logged_in=no; Path=/; Domain=github.com; Expires=Wed, 03 Nov 2021 11:52:55 GMT; HttpOnly; Secure; SameSite=Lax

Было бы совершенно нормально, если бы браузеры уважали этот синтаксис, однако, по крайней мере, для Chrome 86 и Firefox 81 он не работает — браузер берет первый файл cookie, а остальные полностью игнорирует.

После некоторого поиска в Интернете кажется, что requests или фактически urllib3, который используется внутри, объединяет заголовки с тем же именем, как описано здесь.

Поскольку файлы cookie доступны в файле CookieJar request, я решил, что было бы нормально пройтись по банке и подготовить каждый файл cookie для установки в качестве отдельного заголовка ответа прокси:

import requests 

response = requests.get('https://github.com') 

for cookie in response.cookies:
  proxy_cookie = f'{cookie.name}={cookie.value}; expires={cookie.expires}; path={cookie.path}; ...'
  # append to proxy response headers

Но для этого требуется проверить определенное подполе файла cookie и добавить его, только если оно существует, например Secure или HttpOnly.

Другая идея состоит в том, чтобы захватить заголовок ответа Set-Cookie и разделить его на ", ", но, как оказалось, по крайней мере, для моей локали поле expires само по себе содержит ", ", поэтому разделение становится довольно рискованным и явно не пуленепробиваемым.

Есть ли другой разумный способ обработки заголовков ответов cookie без сложного разделения строк или итераций? Я просто хотел бы получить заголовки ответов в том виде, в каком они были возвращены целевым ресурсом, без дополнительных преобразований, выполняемых по пути.

Спасибо.


person Dandry    schedule 03.11.2020    source источник