0

Having the same problem as the poster of this question: httplib2, how to set more than one cookie?

The cookie looks like this..

PHPSESSID=8527b5532b6018aec4159d81f69765bd; path=/; expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578; expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456; expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd

Note how it uses commas as well as semi-colons to separate cookies, but commas are also used in the cookie itself.

This is too complicated for me to write a regex to separate them properly, it would be very much appreciated if anyone wants to give it a shot!

4

2 回答 2

1

请注意它如何使用逗号和分号来分隔 cookie,但 cookie 本身也使用了逗号。

如所引用的,模棱两可的逗号使字符串无法用正则表达式或任何其他工具解析。那个字符串是从哪里来的?

作为Set-Cookie:标头值,它将完全无效,并且在任何浏览器中都不起作用。浏览器会将 PHPSESSID 设置为会话 cookie(因为过期日期格式因额外的逗号无效),而忽略其余部分。多个 cookie 必须设置多个Set-Cookie标头,而不是合并为一个。

编辑:好的,似乎正在发生的是 httplib2 正在使用 stdlibemail包处理 HTTP 响应数据来解析标头。在电子邮件中,RFC822 系列标准要求具有相同名称(例如To:地址)的多个标头等效于具有逗号连接的值的单个标头。

但是,HTTP 响应明确不是RFC822 系列标准;以这种方式处理它们是完全不合适的。看起来,通过使用email来解析 HTTP 响应,httplib2已经使自己无法正确处理任何多次使用的标头,并且Set-Cookie标头经常被这样使用。出于这个原因,我认为httplib2从根本上坏了,建议不要使用它。

于 2010-02-19T14:22:40.733 回答
1

你试过cookielib / http.cookiejar 吗?


如果您将 cookie 解释为

PHPSESSID=8527b5532b6018aec4159d81f69765bd;
path=/;
expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578;
expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456; 
expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd

那么只有分号是真正的分隔符,而逗号分隔符只是由于前面的到期日期。

如果您对到期日期不感兴趣,那么您可以使用 1 个正则表达式来过滤掉到期日期,例如

s/expires=[^,]+,[^,]+, //g

然后用 分隔整个字符串;,并将它们key=value成对解析。

于 2010-02-19T14:03:18.707 回答