2011-08-22 21 views
6

Uso web.py, que internamente utiliza la clase cookie.SimpleCookie para cargar las cookies entrantes desde el navegador del usuario.CookieError: valor de clave ilegal

De vez en cuando, me sale excepciones como:

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

El carácter ofensivo parece ser la barra inclinada (/), que, según mi lectura de RFC 2109 (cookies) y RFC 2068 (HTTP 1.1) debe ser no permitido, así que está bien.

No configuro esta cookie, y no estoy seguro de por qué o cómo se configuró para mi dominio (¿un proxy, quizás?), Pero eso es irrelevante; el problema más grande es que simplecookie falla mucho cuando se encuentra con esta cookie y devuelve un error al usuario.

Entonces, mi pregunta es: ¿hay alguna manera de pedir SimpleCookie simplemente ignorar las cookies que no son válidas, pero devolver el resto? No pude encontrar nada obvio en los documentos para hacer esto.

+0

¿No puede simplemente capturar la excepción CookieError? – GWW

+0

Puedo (y debo), pero como es una excepción, no puedo acceder a las otras cookies, incluida nuestra cookie de sesión. Y las solicitudes posteriores aún contendrán la misma cookie que causó el error. Además, si proviene de un proxy, intentarlo será en vano, ya que el proxy simplemente lo volverá a configurar la próxima vez. – dcrosta

Respuesta

0

Mi aplicación webpy ha experimentado CookieError: Illegal key value:)|utmcmd establecido por Google Analytics en el navegador Firefox. Para solucionarlo genero un redireccionamiento intentando establecer el valor correcto.

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

Lamentablemente, esto no funcionará para mí, porque intentar establecer una cookie cuyo nombre sea ilegal seguirá arrojando el error de cookie. Esto, a su vez, no elimina la cookie, y el problema vuelve la próxima vez. – dcrosta

+0

¿El nombre o el valor de la cookie tienen caracteres ilegales? En mi caso, es el valor, así que lo reinicié con el valor correcto y lo redireccioné a la misma URL, de modo que se corrigió la cookie incorrecta. –

+0

Creo que las barras diagonales son ilegales. Cada navegador en el que he insertado esta cookie funciona bien, pero el módulo 'Cookie' parece ser más pedante que los navegadores. – dcrosta

3

Esto funciona para mí.

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