Skip to content

Commit

Permalink
test: better handling of no content length
Browse files Browse the repository at this point in the history
  • Loading branch information
joamag committed May 30, 2024
1 parent b4399ca commit bea8295
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
3 changes: 3 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[pytest]
python_files = *.py
testpaths = src/netius/test
8 changes: 7 additions & 1 deletion src/netius/common/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,13 @@ def parse_closed(self):
the sending of a EOF character (with semantic value).
"""

if not self.chunked and self.content_l == -1 and self.state == MESSAGE_STATE:
if (
not self.chunked
and self.content_l == -1
and self.state == MESSAGE_STATE
and self.version
and self.version <= HTTP_11
):
self.state = FINISH_STATE
self.trigger("on_data")

Expand Down
31 changes: 31 additions & 0 deletions src/netius/test/common/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@
\r\n\
Hello World"

NO_LENGTH_RESPONSE = b"HTTP/1.1 200 OK\r\n\
Date: Wed, 1 Jan 2014 00:00:00 GMT\r\n\
Server: Test Service/1.0.0\r\n\
\r\n\
Hello World"


class HTTPParserTest(unittest.TestCase):

Expand All @@ -103,6 +109,7 @@ def test_simple(self):
parser.parse(SIMPLE_REQUEST)
message = parser.get_message()
headers = parser.get_headers()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
self.assertEqual(parser.method, "get")
self.assertEqual(parser.version, netius.common.HTTP_11)
self.assertEqual(parser.path_s, "http://localhost")
Expand All @@ -120,6 +127,7 @@ def test_chunked(self):
parser.parse(CHUNKED_REQUEST)
message = parser.get_message()
headers = parser.get_headers()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
self.assertEqual(parser.method, "get")
self.assertEqual(parser.version, netius.common.HTTP_11)
self.assertEqual(parser.path_s, "http://localhost")
Expand All @@ -137,6 +145,7 @@ def test_malformed(self):
parser.parse(EXTRA_SPACES_REQUEST)
message = parser.get_message()
headers = parser.get_headers()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
self.assertEqual(parser.method, "get")
self.assertEqual(parser.version, netius.common.HTTP_11)
self.assertEqual(parser.path_s, "/")
Expand All @@ -153,6 +162,7 @@ def test_malformed(self):
parser.parse(INVALID_HEADERS_REQUEST)
message = parser.get_message()
headers = parser.get_headers()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
self.assertEqual(parser.method, "get")
self.assertEqual(parser.version, netius.common.HTTP_11)
self.assertEqual(parser.path_s, "/")
Expand Down Expand Up @@ -251,6 +261,7 @@ def test_file(self):
parser.parse(CHUNKED_REQUEST)
message = parser.get_message()
message_b = parser.get_message_b()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
self.assertEqual(message, b"Hello World")
self.assertNotEqual(parser.message_f, None)
self.assertNotEqual(parser.message_f.read, None)
Expand Down Expand Up @@ -305,3 +316,23 @@ def test_clear(self):
self.assertEqual(parser.chunk_l, 0)
self.assertEqual(parser.chunk_s, 0)
self.assertEqual(parser.chunk_e, 0)

def test_no_length_response(self):
parser = netius.common.HTTPParser(self, type=netius.common.RESPONSE, store=True)
try:
parser.parse(NO_LENGTH_RESPONSE)
message = parser.get_message()
headers = parser.get_headers()
self.assertEqual(parser.state, netius.common.http.MESSAGE_STATE)
self.assertEqual(parser.code, 200)
self.assertEqual(parser.status, "OK")
self.assertEqual(parser.version, netius.common.HTTP_11)
self.assertEqual(parser.content_l, -1)
self.assertEqual(message, b"Hello World")
self.assertEqual(headers["Date"], "Wed, 1 Jan 2014 00:00:00 GMT")
self.assertEqual(headers["Server"], "Test Service/1.0.0")

parser.parse_closed()
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
finally:
parser.clear()

0 comments on commit bea8295

Please sign in to comment.