summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Unterwaditzer <markus@unterwaditzer.net>2017-01-10 11:57:57 +0100
committerMarkus Unterwaditzer <markus@unterwaditzer.net>2017-01-10 11:57:57 +0100
commitcbd8536b78b187766c67d21db3b81d284563a794 (patch)
tree47ee27ad38a46cce9b2cc9e443fafc50b156b505
parentc5f704c894893cfdd496adcb5c358f406ccbaf84 (diff)
parentbb83b777c510dd408511febfe7a61ef459ebcd19 (diff)
downloadwerkzeug-cbd8536b78b187766c67d21db3b81d284563a794.tar.gz
Merge branch '0.11-maintenance'
-rw-r--r--CHANGES12
-rw-r--r--tests/test_serving.py29
-rw-r--r--werkzeug/serving.py9
3 files changed, 45 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index c3de2267..527050d8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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