urllib2响应中的多个Set-Cookie头

3 投票
3 回答
3937 浏览
提问于 2025-04-15 20:29

我正在使用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'

撰写回答