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