aboutsummaryrefslogtreecommitdiff
path: root/dummyserver/handlers.py
diff options
context:
space:
mode:
Diffstat (limited to 'dummyserver/handlers.py')
-rw-r--r--dummyserver/handlers.py57
1 files changed, 52 insertions, 5 deletions
diff --git a/dummyserver/handlers.py b/dummyserver/handlers.py
index ab48b53..bc51f31 100644
--- a/dummyserver/handlers.py
+++ b/dummyserver/handlers.py
@@ -87,7 +87,7 @@ class TestingApp(WSGIHandler):
if request.method != method:
return Response("Wrong method: %s != %s" %
- (method, request.method), status='400')
+ (method, request.method), status='400 Bad Request')
return Response()
def upload(self, request):
@@ -100,17 +100,18 @@ class TestingApp(WSGIHandler):
if len(files_) != 1:
return Response("Expected 1 file for '%s', not %d" %(param, len(files_)),
- status='400')
+ status='400 Bad Request')
file_ = files_[0]
data = file_['body']
if int(size) != len(data):
return Response("Wrong size: %d != %d" %
- (size, len(data)), status='400')
+ (size, len(data)), status='400 Bad Request')
if filename != file_['filename']:
return Response("Wrong filename: %s != %s" %
- (filename, file_.filename), status='400')
+ (filename, file_.filename),
+ status='400 Bad Request')
return Response()
@@ -118,7 +119,7 @@ class TestingApp(WSGIHandler):
"Perform a redirect to ``target``"
target = request.params.get('target', '/')
headers = [('Location', target)]
- return Response(status='303', headers=headers)
+ return Response(status='303 See Other', headers=headers)
def keepalive(self, request):
if request.params.get('close', b'0') == b'1':
@@ -169,3 +170,49 @@ class TestingApp(WSGIHandler):
def shutdown(self, request):
sys.exit()
+
+
+# RFC2231-aware replacement of internal tornado function
+def _parse_header(line):
+ r"""Parse a Content-type like header.
+
+ Return the main content-type and a dictionary of options.
+
+ >>> d = _parse_header("CD: fd; foo=\"bar\"; file*=utf-8''T%C3%A4st")[1]
+ >>> d['file'] == 'T\u00e4st'
+ True
+ >>> d['foo']
+ 'bar'
+ """
+ import tornado.httputil
+ import email.utils
+ from urllib3.packages import six
+ if not six.PY3:
+ line = line.encode('utf-8')
+ parts = tornado.httputil._parseparam(';' + line)
+ key = next(parts)
+ # decode_params treats first argument special, but we already stripped key
+ params = [('Dummy', 'value')]
+ for p in parts:
+ i = p.find('=')
+ if i >= 0:
+ name = p[:i].strip().lower()
+ value = p[i + 1:].strip()
+ params.append((name, value))
+ params = email.utils.decode_params(params)
+ params.pop(0) # get rid of the dummy again
+ pdict = {}
+ for name, value in params:
+ print(repr(value))
+ value = email.utils.collapse_rfc2231_value(value)
+ if len(value) >= 2 and value[0] == '"' and value[-1] == '"':
+ value = value[1:-1]
+ pdict[name] = value
+ return key, pdict
+
+# TODO: make the following conditional as soon as we know a version
+# which does not require this fix.
+# See https://github.com/facebook/tornado/issues/868
+if True:
+ import tornado.httputil
+ tornado.httputil._parse_header = _parse_header