2011-08-22 13 views
6

Używam klasy web.py, która wewnętrznie używa klasy cookie.SimpleCookie do ładowania plików cookie przychodzących z przeglądarki użytkownika.CookieError: Nielegalna wartość klucza

Czasami otrzymuję wyjątki jak:

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

Charakter wykraczająca wydaje się być ukośnik (/), które, według mojego czytania RFC 2109 (cookies) i RFC 2068 (HTTP 1.1) powinny być niedozwolone, więc jest OK.

Nie ustawiam tego ciasteczka i nie jestem pewien, dlaczego i jak zostało ustawione dla mojej domeny (być może proxy?), Ale to nie ma znaczenia; Większym problemem jest to, że simplecookie bardzo się nie udaje po napotkaniu tego pliku cookie i zwraca błąd użytkownikowi.

Moje pytanie brzmi: czy istnieje sposób, aby poprosić o usunięcie plików cookie, które są nieważne, ale zwrócić resztę? Nie mogłem znaleźć niczego oczywistego w dokumentach, aby to zrobić.

+0

Nie możesz po prostu uchwycić wyjątku CookieError? – GWW

+0

Mogę (i powinienem), ale ponieważ jest to wyjątek, nie mogę uzyskać dostępu do innych plików cookie, w tym naszego pliku cookie sesji. Kolejne żądania będą nadal zawierać ten sam plik cookie, który spowodował błąd. Co więcej, jeśli pochodzi z serwera proxy, próba jego rozbrojenia prawdopodobnie będzie daremna, ponieważ serwer proxy po prostu ponownie ustawi go następnym razem. – dcrosta

Odpowiedz

0

Moja aplikacja webpy doświadczyła zestawu CookieError: Illegal key value:)|utmcmd ustawionego przez Google Analytics w przeglądarce Firefox. Aby to naprawić, wysyłam przekierowanie próbujące ustawić poprawną wartość.

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

Niestety to nie zadziała, ponieważ próba ustawienia pliku cookie, którego nazwa jest nielegalna, nadal będzie powodować błąd pliku cookie. To z kolei nie usuwa pliku cookie, a problem pojawia się następnym razem. – dcrosta

+0

Czy nazwa lub wartość pliku cookie ma niedozwolone znaki? W moim przypadku jest to wartość, więc resetuję ją z poprawną wartością i przekierowuję z powrotem do tego samego adresu URL - tak, że nieprawidłowy plik cookie zostaje naprawiony. –

+0

Myślę, że ukośniki są nielegalne. Każda przeglądarka, do której wstawiłem ten plik cookie, działa dobrze, ale moduł 'Cookie' wydaje się być bardziej pedantyczny niż przeglądarki. – dcrosta

3

To działa dla mnie.

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 
Powiązane problemy