2011-08-22 40 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