From 2b885ce4dc3f6b2ea2707a39a8198a84d7ad3991 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 30 Oct 2012 14:47:17 +0000 Subject: [PATCH] Added better error reporting for unicode errors in sessions --- flask/debughelpers.py | 6 ++++++ flask/sessions.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/flask/debughelpers.py b/flask/debughelpers.py index edf8c111..3ebd2f3e 100644 --- a/flask/debughelpers.py +++ b/flask/debughelpers.py @@ -10,6 +10,12 @@ """ +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + class DebugFilesKeyError(KeyError, AssertionError): """Raised from request.files during debugging. The idea is that it can provide a better error message than just a generic KeyError/BadRequest. diff --git a/flask/sessions.py b/flask/sessions.py index 46ce0830..bbf41ba0 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -66,6 +66,14 @@ class TaggedJSONSerializer(object): return {' d': http_date(value)} elif isinstance(value, dict): return dict((k, _tag(v)) for k, v in value.iteritems()) + elif isinstance(value, str): + try: + return unicode(value) + except UnicodeError: + raise UnexpectedUnicodeError(u'A byte string with ' + u'non-ASCII data was passed to the session system ' + u'which can only store unicode strings. Consider ' + u'base64 encoding your string (String was %r)' % value) return value return json.dumps(_tag(value), separators=(',', ':')) @@ -292,3 +300,6 @@ class SecureCookieSessionInterface(SessionInterface): response.set_cookie(app.session_cookie_name, val, expires=expires, httponly=httponly, domain=domain, path=path, secure=secure) + + +from flask.debughelpers import UnexpectedUnicodeError