urllib2响应中的多个Set-Cookie头
我正在使用urllib2这个工具和一个网站进行交互,这个网站返回了多个Set-Cookie的头信息。但是,我发现响应的头信息字典里只包含一个,似乎是重复的键互相覆盖了。
有没有办法用urllib2访问这些重复的头信息呢?
3 个回答
0
这对我来说绝对不是这样。我在浏览器的开发者工具中运行了 Python 3.10.0
,OCS 提供了这两个 Set-Cookie 头:
**set-cookie**:
JSESSIONID=node01v0bwkcyhmqot1a3eqp3lcvwd2600.node0;
Path=/;
Secure;
HttpOnly;
SameSite=Lax
**set-cookie**:
ZS-TOKEN-ID=apt688t8gfqf7r4zgkv60aii;
HttpOnly;
SameSite=Lax;
Path=/;
Secure;
Max-Age=36000
在 r.headers['Set-Cookie']
中,它们没有被合并。只有第一个 cookie 被列出来。
0
set-cookie
是不一样的。根据 RFC 6265 的规定:
原始服务器不应该把多个 Set-Cookie 头信息合并成一个头信息。通常情况下,HTTP 头信息的合并方式(也就是在 [RFC2616] 中定义的)可能会改变 Set-Cookie 头信息的含义,因为 Set-Cookie 中使用的 %x2C (",") 字符与这种合并方式是有冲突的。
从理论上讲,这看起来像是一个错误。
5
根据urllib2的文档,结果URL对象的.headers
属性是一个httplib.HTTPMessage
(看起来在Python的文档中没有详细说明)。
不过,
help(httplib.HTTPMessage)
...
If multiple header fields with the same name occur, they are combined
according to the rules in RFC 2616 sec 4.2:
Appending each subsequent field-value to the first, each separated
by a comma. The order in which header fields with the same field-name
are received is significant to the interpretation of the combined
field value.
所以,如果你访问u.headers['Set-Cookie'],你应该能得到一个Set-Cookie头,里面的值用逗号分开。
确实,情况就是这样。
import httplib
from StringIO import StringIO
msg = \
"""Set-Cookie: Foo
Set-Cookie: Bar
Set-Cookie: Baz
This is the message"""
msg = StringIO(msg)
msg = httplib.HTTPMessage(msg)
assert msg['Set-Cookie'] == 'Foo, Bar, Baz'