2011-08-22 13 views
6

Io uso web.py, che utilizza internamente la classe cookie.SimpleCookie per caricare i cookie in arrivo dal browser dell'utente.CookieError: valore chiave illegale

Di tanto in tanto, ottengo eccezioni come:

... 
    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 

Il carattere offensivo sembra essere la barra (/), che, secondo la mia lettura dei RFC 2109 (biscotti) e RFC 2068 (HTTP 1.1) dovrebbe essere non consentito, quindi va bene.

Non ho impostato questo cookie e non sono sicuro del perché o del modo in cui è stato impostato per il mio dominio (un proxy, forse?), Ma questo è irrilevante; il problema più grande è che simplecookie fallisce quando incontra questo cookie e restituisce un errore all'utente.

Quindi, la mia domanda è: c'è un modo per chiedere a SimpleCookie di ignorare semplicemente i cookie che non sono validi, ma restituire il resto? Non ho trovato nulla di ovvio nei documenti per farlo.

+0

Non riesci a rilevare l'eccezione CookieError? – GWW

+0

Posso (e devo), ma poiché si tratta di un'eccezione, non posso accedere agli altri cookie, incluso il nostro cookie di sessione. E le richieste successive continueranno a contenere lo stesso cookie che ha causato l'errore. Inoltre, se proviene da un proxy, tentare di disinserirlo sarà probabilmente invano, poiché il proxy lo reimposterà appena la prossima volta. – dcrosta

risposta

0

La mia app webpy ha rilevato CookieError: Illegal key value:)|utmcmd impostata da Google Analytics nel browser Firefox. Per risolvere il problema, rediretto il problema cercando di impostare il valore corretto.

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

Purtroppo questo non funzionerà per me, perché il tentativo di impostare un cookie il cui nome è illegale causerà comunque l'errore del cookie. Questo a sua volta non elimina il cookie e il problema si ripresenta la volta successiva. – dcrosta

+0

Il nome o il valore del cookie ha caratteri non validi? Nel mio caso è il valore, quindi l'ho resettato con il valore corretto e reindirizzato allo stesso URL, quindi il cookie errato viene corretto. –

+0

Penso che le barre in avanti siano illegali. Ogni browser in cui ho inserito questo cookie funziona bene, ma il modulo 'Cookie' sembra essere più pedante dei browser. – dcrosta

3

Questo funziona per me.

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