summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Philippsen <nils@redhat.com>2015-08-20 10:30:28 +0200
committerNils Philippsen <nils@redhat.com>2015-08-20 10:30:28 +0200
commite429aea5bc693ffb50b7cdaefd0a6e24ead2afa1 (patch)
treebd0c1a94cc94455465a7387f2a54cfea7ac3d934
parent3b32d2f358eab38c0318475d1d191c68d1dd990d (diff)
downloadpaste-e429aea5bc693ffb50b7cdaefd0a6e24ead2afa1.tar.gz
Python 3: add workarounds for cgi.FieldStorage
cgi.FieldStorage keeps some keys as str, some as the repr() of the byte-encoded key, duh. Fixes (well...): tests.test_cgiapp.test_form
-rwxr-xr-xtests/cgiapp_data/form.cgi59
1 files changed, 58 insertions, 1 deletions
diff --git a/tests/cgiapp_data/form.cgi b/tests/cgiapp_data/form.cgi
index 2181998..c4c562d 100755
--- a/tests/cgiapp_data/form.cgi
+++ b/tests/cgiapp_data/form.cgi
@@ -1,11 +1,68 @@
#!/usr/bin/env python
+from __future__ import print_function
+
import cgi
+import six
print('Content-type: text/plain')
print('')
-form = cgi.FieldStorage()
+if six.PY3:
+ # Python 3: cgi.FieldStorage keeps some field names as unicode and some as
+ # the repr() of byte strings, duh.
+
+ class FieldStorage(cgi.FieldStorage):
+
+ def _key_candidates(self, key):
+ yield key
+
+ try:
+ # assume bytes, coerce to str
+ try:
+ yield key.decode(self.encoding)
+ except UnicodeDecodeError:
+ pass
+ except AttributeError:
+ # assume str, coerce to bytes
+ try:
+ yield key.encode(self.encoding)
+ except UnicodeEncodeError:
+ pass
+
+ def __getitem__(self, key):
+
+ superobj = super(FieldStorage, self)
+
+ error = None
+
+ for candidate in self._key_candidates(key):
+ if isinstance(candidate, bytes):
+ # ouch
+ candidate = repr(candidate)
+ try:
+ return superobj.__getitem__(candidate)
+ except KeyError as e:
+ if error is None:
+ error = e
+
+ # fall through, re-raise the first KeyError
+ raise error
+
+ def __contains__(self, key):
+ superobj = super(FieldStorage, self)
+
+ for candidate in self._key_candidates(key):
+ if superobj.__contains__(candidate):
+ return True
+ return False
+
+else: # PY2
+
+ FieldStorage = cgi.FieldStorage
+
+
+form = FieldStorage()
print('Filename: %s' % form['up'].filename)
print('Name: %s' % form['name'].value)