【发布时间】:2011-01-28 02:38:47
【问题描述】:
我正在使用 urllib2 与发送回多个 Set-Cookie 标头的网站进行交互。然而,响应头字典只包含一个 - 似乎重复的键相互覆盖。
有没有办法使用 urllib2 访问重复的标头?
【问题讨论】:
标签: python header urllib2 setcookie
我正在使用 urllib2 与发送回多个 Set-Cookie 标头的网站进行交互。然而,响应头字典只包含一个 - 似乎重复的键相互覆盖。
有没有办法使用 urllib2 访问重复的标头?
【问题讨论】:
标签: python header urllib2 setcookie
根据urllib2 docs,结果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'
【讨论】:
Lib/cookielib。
set-cookie 是不同的。来自 RFC 6265:
源服务器不应将多个 Set-Cookie 标头字段折叠到 单个标题字段。折叠 HTTP 标头的常用机制 字段(即,如 [RFC2616] 中定义的)可能会改变 Set-Cookie 标头字段,因为使用了 %x2C (",") 字符 通过 Set-Cookie 以与此类折叠冲突的方式。
那么理论上,这看起来像是一个错误。
【讨论】:
这对我来说绝对不是这样。我在浏览器开发工具中运行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。
【讨论】: