2011-08-22 24 views
6

Tôi sử dụng web.py, trong đó sử dụng nội bộ lớp cookie.SimpleCookie để tải cookie đến từ trình duyệt của người dùng.CookieError: Giá trị khóa bất hợp pháp

thoảng, tôi nhận được trường hợp ngoại lệ như:

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

Nhân vật vi phạm có vẻ là dấu gạch chéo (/), trong đó, theo tài liệu tôi đọc của RFC 2109 (cookie) và RFC 2068 (HTTP 1.1) nên không được phép, vì vậy đó là OK.

Tôi không đặt cookie này và tôi không chắc chắn lý do hoặc cách thức được đặt cho tên miền của mình (proxy, có thể?), Nhưng điều đó không liên quan; vấn đề lớn hơn là simplecookie không gặp khó khăn khi nó gặp cookie này và trả về lỗi cho người dùng.

Vì vậy, câu hỏi của tôi là: có cách nào để yêu cầu SimpleCookie chỉ đơn giản bỏ qua các cookie không hợp lệ, nhưng trả lại phần còn lại? Tôi không thể tìm thấy bất cứ điều gì rõ ràng trong các tài liệu để làm điều này.

+0

Bạn không thể bắt ngoại lệ CookieError? – GWW

+0

Tôi có thể (và nên), nhưng vì đó là một ngoại lệ, tôi không thể truy cập các cookie khác, bao gồm cookie phiên của chúng tôi. Và các yêu cầu tiếp theo sẽ vẫn chứa cùng một cookie gây ra lỗi. Hơn nữa, nếu nó đến từ một proxy, cố gắng bỏ đặt nó có thể sẽ vô ích, vì proxy sẽ chỉ thiết lập lại nó vào lần sau. – dcrosta

Trả lời

0

Ứng dụng webpy của tôi đã trải nghiệm CookieError: Illegal key value:)|utmcmd do Google Analytics đặt trong trình duyệt Firefox. Để khắc phục nó, tôi phát hành chuyển hướng cố gắng đặt giá trị chính xác.

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

Thật không may điều này sẽ không làm việc cho tôi, bởi vì cố gắng thiết lập một cookie có tên là bất hợp pháp sẽ vẫn ném lỗi cookie. Điều này lần lượt không xóa cookie, và vấn đề trở lại lần sau. – dcrosta

+0

Tên hoặc giá trị của cookie có các ký tự không hợp lệ không? Trong trường hợp của tôi nó là giá trị, vì vậy tôi đặt lại giá trị đó với giá trị chính xác và chuyển hướng trở lại cùng một URL - do đó, cookie không chính xác được khắc phục. –

+0

Tôi nghĩ rằng dấu gạch chéo về phía trước là bất hợp pháp. Mỗi trình duyệt tôi đã đưa cookie này vào hoạt động tốt, nhưng mô-đun 'Cookie' dường như có nhiều tính năng hơn so với trình duyệt. – dcrosta

3

Điều này phù hợp với tôi.

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 
Các vấn đề liên quan