Я использую бессерверное приложение 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 без сложного разделения строк или итераций? Я просто хотел бы получить заголовки ответов в том виде, в каком они были возвращены целевым ресурсом, без дополнительных преобразований, выполняемых по пути.
Спасибо.