r47143 - Merge http-server-invalid-header-8101-2: Fix exception in twisted.web.http.HTTPChannel.headerReceived when malformed data is received.
adiroiban-TA+aISz0psMTMxyoc4vAAJOcrHinNvQL0E9HWUfgJXw@public.gmane.org Mon, 4 Apr 2016 00:43:50 -0600 (MDT)
| Newsgroups | gmane.comp.python.twisted.commits |
|---|---|
| Message-ID | <[email protected]> |
Author: adiroiban
Date: Mon Apr 4 00:43:35 2016
New Revision: 47143
Added:
trunk/twisted/web/topfiles/8101.bugfix
Modified:
trunk/twisted/web/http.py
trunk/twisted/web/test/test_http.py
Log:
Merge http-server-invalid-header-8101-2: Fix exception in twisted.web.http.HTTPChannel.headerReceived when malformed data is received.
Author: pawelmhm
Reviewer: adiroiban
Fixes: #8101
Modified: trunk/twisted/web/http.py
==============================================================================
--- trunk/twisted/web/http.py (original)
+++ trunk/twisted/web/http.py Mon Apr 4 00:43:35 2016
@@ -1822,7 +1822,12 @@
@param line: A line from the header section of a request, excluding the
line delimiter.
"""
- header, data = line.split(b':', 1)
+ try:
+ header, data = line.split(b':', 1)
+ except ValueError:
+ self._respondToBadRequestAndDisconnect()
+ return
+
header = header.lower()
data = data.strip()
if header == b'content-length':
Modified: trunk/twisted/web/test/test_http.py
==============================================================================
--- trunk/twisted/web/test/test_http.py (original)
+++ trunk/twisted/web/test/test_http.py Mon Apr 4 00:43:35 2016
@@ -974,7 +974,7 @@
b"HTTP/1.1 400 Bad Request\r\n\r\n")
- def test_invalidHeaders(self):
+ def test_invalidContentLengthHeader(self):
"""
If a Content-Length header with a non-integer value is received, a 400
(Bad Request) response is sent to the client and the connection is
@@ -988,6 +988,19 @@
self.assertTrue(channel.transport.disconnecting)
+ def test_invalidHeaderNoColon(self):
+ """
+ If a header without colon is received a 400 (Bad Request) response
+ is sent to the client and the connection is closed.
+ """
+ requestLines = [b"GET / HTTP/1.0", b"HeaderName ", b"", b""]
+ channel = self.runRequest(b"\n".join(requestLines), http.Request, 0)
+ self.assertEqual(
+ channel.transport.value(),
+ b"HTTP/1.1 400 Bad Request\r\n\r\n")
+ self.assertTrue(channel.transport.disconnecting)
+
+
def test_headerLimitPerRequest(self):
"""
L{HTTPChannel} enforces the limit of C{HTTPChannel.maxHeaders} per