我正在使用充当代理的无服务器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子字段,并仅在确实存在子字段时才添加它,例如Secure
或HttpOnly
。
另一个想法是获取Set-Cookie
响应标头并将其除以", "
,但事实证明,至少对于我的语言环境,expires
字段包含{{1} }本身,因此拆分变得非常危险,而且显然不是防弹的。
是否存在其他无需复杂的字符串拆分或迭代即可处理Cookie响应标头的智能方法?我只是想以目标资源返回的形式获取响应头,而无需在此过程中进行其他转换。
谢谢。