2011-08-22 45 views
6

我使用web.py,它在内部使用cookie.SimpleCookie类来加载从用户浏览器传入的Cookie。CookieError:非法密钥值

偶尔,我得到这样的例外:

... 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/Cookie.py", line 455, in set 
    raise CookieError("Illegal key value: %s" % key) 
CookieError: Illegal key value: SinaRot/g/news.sina.com.cn 

违规的性质似乎正斜杠(/),其中,根据我的阅读RFC 2109(饼干)和RFC 2068(HTTP 1.1)应不允许,所以没关系。

我没有设置这个cookie,我不确定它为什么或如何为我的域设置(代理,也许?),但这是不相关的;更大的问题是simplecookie在遇到这个cookie时会失败,并向用户返回一个错误。

所以,我的问题是:有什么办法要求SimpleCookie简单地忽略无效的cookie,但返回其余的?我在文档中找不到任何明显的内容来执行此操作。

+0

难道你不能只是赶上CookieError异常? – GWW

+0

我可以(也应该),但因为它是一个例外,我无法访问其他cookie,包括我们的会话cookie。随后的请求仍将包含导致错误的相同Cookie。此外,如果它来自代理,试图解除它将很可能是徒劳的,因为代理将在下一次重新设置它。 – dcrosta

回答

0

我的webpy应用程序经历了Google Analytics在Firefox浏览器中设置的CookieError: Illegal key value:)|utmcmd。要解决它,我发出尝试设置正确值的重定向。

def myinternalerror(): 
    try: 
     web.cookies() 
    except CookieError: 
     if not "cookie_err" in web.input(): 
      web.setcookie("__utmz", None, domain=web.ctx.host) 
      raise web.seeother(web.changequery(cookie_err=1)) 
    return web.internalerror(render.site.e500()) 

if not web.config.debug: 
    app.internalerror = myinternalerror 
+0

不幸的是,这对我不起作用,因为试图设置名称不合法的cookie仍会抛出cookie错误。这反过来不会删除cookie,并且下次问题会再次出现。 – dcrosta

+0

Cookie的名称或价值是否有非法字符?在我的情况下,它是价值,所以我重置它正确的价值和重定向回到相同的URL - 所以不正确的cookie得到修复。 –

+0

我认为正斜线是非法的。每个浏览器都插入了这个cookie,但是'Cookie'模块似乎比浏览器更迂腐。 – dcrosta

3

这适用于我。

def get_cookies(): 
    import Cookie 
    ans = Cookie.SimpleCookie() 
    for bit in os.environ.get('HTTP_COOKIE', '').split('; '): 
     try: 
      ans.load(bit) 
     except Cookie.CookieError: 
      pass 
    return ans