【问题标题】:urllib2 multiple Set-Cookie headers in responseurllib2 多个 Set-Cookie 标头作为响应
【发布时间】:2011-01-28 02:38:47
【问题描述】:

我正在使用 urllib2 与发送回多个 Set-Cookie 标头的网站进行交互。然而,响应头字典只包含一个 - 似乎重复的键相互覆盖。

有没有办法使用 urllib2 访问重复的标头?

【问题讨论】:

    标签: python header urllib2 setcookie


    【解决方案1】:

    根据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'
    

    【讨论】:

    • Rushabh:不,但是对于 cookie 之类的东西,有一些库可以处理 RFC 2616 规则。见Lib/cookielib
    【解决方案2】:

    set-cookie 是不同的。来自 RFC 6265:

    源服务器不应将多个 Set-Cookie 标头字段折叠到 单个标题字段。折叠 HTTP 标头的常用机制 字段(即,如 [RFC2616] 中定义的)可能会改变 Set-Cookie 标头字段,因为使用了 %x2C (",") 字符 通过 Set-Cookie 以与此类折叠冲突的方式。

    那么理论上,这看起来像是一个错误。

    【讨论】:

      【解决方案3】:

      这对我来说绝对不是这样。我在浏览器开发工具中运行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。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2011-08-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多