diff options
author | Markus Unterwaditzer <markus@unterwaditzer.net> | 2017-01-10 11:57:57 +0100 |
---|---|---|
committer | Markus Unterwaditzer <markus@unterwaditzer.net> | 2017-01-10 11:57:57 +0100 |
commit | cbd8536b78b187766c67d21db3b81d284563a794 (patch) | |
tree | 47ee27ad38a46cce9b2cc9e443fafc50b156b505 | |
parent | c5f704c894893cfdd496adcb5c358f406ccbaf84 (diff) | |
parent | bb83b777c510dd408511febfe7a61ef459ebcd19 (diff) | |
download | werkzeug-cbd8536b78b187766c67d21db3b81d284563a794.tar.gz |
Merge branch '0.11-maintenance'
-rw-r--r-- | CHANGES | 12 | ||||
-rw-r--r-- | tests/test_serving.py | 29 | ||||
-rw-r--r-- | werkzeug/serving.py | 9 |
3 files changed, 45 insertions, 5 deletions
@@ -50,6 +50,18 @@ Unreleased. - Fix self-XSS in debugger console, see ``#1031``. - Fix IPython 5.x shell support, see ``#1033``. +Version 0.11.16 +--------------- + +- werkzeug.serving: set CONTENT_TYPE / CONTENT_LENGTH if only they're provided by the client + +Version 0.11.15 +--------------- + +Released on December 30th 2016. + +- Bugfix for the bugfix in the previous release. + Version 0.11.14 --------------- diff --git a/tests/test_serving.py b/tests/test_serving.py index 1d5906e2..16ba9002 100644 --- a/tests/test_serving.py +++ b/tests/test_serving.py @@ -249,3 +249,32 @@ def test_wrong_protocol(dev_server): log = server.logfile.read() assert 'Traceback' not in log assert '\n127.0.0.1' in log + + +def test_absent_content_length_and_content_type(dev_server): + server = dev_server(''' + def app(environ, start_response): + assert 'CONTENT_LENGTH' not in environ + assert 'CONTENT_TYPE' not in environ + start_response('200 OK', [('Content-Type', 'text/html')]) + return [b'YES'] + ''') + + r = requests.get(server.url) + assert r.content == b'YES' + + +def test_set_content_length_and_content_type_if_provided_by_client(dev_server): + server = dev_server(''' + def app(environ, start_response): + assert environ['CONTENT_LENGTH'] == '233' + assert environ['CONTENT_TYPE'] == 'application/json' + start_response('200 OK', [('Content-Type', 'text/html')]) + return [b'YES'] + ''') + + r = requests.get(server.url, headers={ + 'content_length': '233', + 'content_type': 'application/json' + }) + assert r.content == b'YES' diff --git a/werkzeug/serving.py b/werkzeug/serving.py index fc85bb7f..dfdd9334 100644 --- a/werkzeug/serving.py +++ b/werkzeug/serving.py @@ -128,8 +128,6 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): 'SCRIPT_NAME': '', 'PATH_INFO': wsgi_encoding_dance(path_info), 'QUERY_STRING': wsgi_encoding_dance(request_url.query), - 'CONTENT_TYPE': self.headers.get('Content-Type', ''), - 'CONTENT_LENGTH': self.headers.get('Content-Length', ''), 'REMOTE_ADDR': self.address_string(), 'REMOTE_PORT': self.port_integer(), 'SERVER_NAME': self.server.server_address[0], @@ -138,9 +136,10 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): } for key, value in self.headers.items(): - key = 'HTTP_' + key.upper().replace('-', '_') - if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): - environ[key] = value + key = key.upper().replace('-', '_') + if key not in ('CONTENT_TYPE', 'CONTENT_LENGTH'): + key = 'HTTP_' + key + environ[key] = value if request_url.scheme and request_url.netloc: environ['HTTP_HOST'] = request_url.netloc |