Python的请求汇总Set-Cookie响应标头

时间:2020-11-03 13:11:41

标签: python cookies python-requests urllib3

我正在使用充当代理的无服务器python应用程序。在后台,代理使用requests库向目标资源发起请求,获取响应并返回给调用方。但是,我注意到奇怪的行为。我的目标资源发布了2个cookie-响应包含两个带有cookie有效负载的Set-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,而完全忽略其他cookie。

在进行一些在线挖掘之后,似乎requests或实际上是内部使用的urllib3聚合了具有与here相同名称的标头。

由于cookie在request的CookieJar中可用,因此我认为可以遍历jar并准备将每个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子字段,并仅在确实存在子字段时才添加它,例如SecureHttpOnly

另一个想法是获取Set-Cookie响应标头并将其除以", ",但事实证明,至少对于我的语言环境,expires字段包含{{1} }本身,因此拆分变得非常危险,而且显然不是防弹的。

是否存在其他无需复杂的字符串拆分或迭代即可处理Cookie响应标头的智能方法?我只是想以目标资源返回的形式获取响应头,而无需在此过程中进行其他转换。

谢谢。

0 个答案:

没有答案