Skip to content

Commit bea8295

Browse files
committed
test: better handling of no content length
1 parent b4399ca commit bea8295

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

pytest.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[pytest]
2+
python_files = *.py
3+
testpaths = src/netius/test

src/netius/common/http.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,13 @@ def parse_closed(self):
469469
the sending of a EOF character (with semantic value).
470470
"""
471471

472-
if not self.chunked and self.content_l == -1 and self.state == MESSAGE_STATE:
472+
if (
473+
not self.chunked
474+
and self.content_l == -1
475+
and self.state == MESSAGE_STATE
476+
and self.version
477+
and self.version <= HTTP_11
478+
):
473479
self.state = FINISH_STATE
474480
self.trigger("on_data")
475481

src/netius/test/common/http.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@
9494
\r\n\
9595
Hello World"
9696

97+
NO_LENGTH_RESPONSE = b"HTTP/1.1 200 OK\r\n\
98+
Date: Wed, 1 Jan 2014 00:00:00 GMT\r\n\
99+
Server: Test Service/1.0.0\r\n\
100+
\r\n\
101+
Hello World"
102+
97103

98104
class HTTPParserTest(unittest.TestCase):
99105

@@ -103,6 +109,7 @@ def test_simple(self):
103109
parser.parse(SIMPLE_REQUEST)
104110
message = parser.get_message()
105111
headers = parser.get_headers()
112+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
106113
self.assertEqual(parser.method, "get")
107114
self.assertEqual(parser.version, netius.common.HTTP_11)
108115
self.assertEqual(parser.path_s, "http://localhost")
@@ -120,6 +127,7 @@ def test_chunked(self):
120127
parser.parse(CHUNKED_REQUEST)
121128
message = parser.get_message()
122129
headers = parser.get_headers()
130+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
123131
self.assertEqual(parser.method, "get")
124132
self.assertEqual(parser.version, netius.common.HTTP_11)
125133
self.assertEqual(parser.path_s, "http://localhost")
@@ -137,6 +145,7 @@ def test_malformed(self):
137145
parser.parse(EXTRA_SPACES_REQUEST)
138146
message = parser.get_message()
139147
headers = parser.get_headers()
148+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
140149
self.assertEqual(parser.method, "get")
141150
self.assertEqual(parser.version, netius.common.HTTP_11)
142151
self.assertEqual(parser.path_s, "/")
@@ -153,6 +162,7 @@ def test_malformed(self):
153162
parser.parse(INVALID_HEADERS_REQUEST)
154163
message = parser.get_message()
155164
headers = parser.get_headers()
165+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
156166
self.assertEqual(parser.method, "get")
157167
self.assertEqual(parser.version, netius.common.HTTP_11)
158168
self.assertEqual(parser.path_s, "/")
@@ -251,6 +261,7 @@ def test_file(self):
251261
parser.parse(CHUNKED_REQUEST)
252262
message = parser.get_message()
253263
message_b = parser.get_message_b()
264+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
254265
self.assertEqual(message, b"Hello World")
255266
self.assertNotEqual(parser.message_f, None)
256267
self.assertNotEqual(parser.message_f.read, None)
@@ -305,3 +316,23 @@ def test_clear(self):
305316
self.assertEqual(parser.chunk_l, 0)
306317
self.assertEqual(parser.chunk_s, 0)
307318
self.assertEqual(parser.chunk_e, 0)
319+
320+
def test_no_length_response(self):
321+
parser = netius.common.HTTPParser(self, type=netius.common.RESPONSE, store=True)
322+
try:
323+
parser.parse(NO_LENGTH_RESPONSE)
324+
message = parser.get_message()
325+
headers = parser.get_headers()
326+
self.assertEqual(parser.state, netius.common.http.MESSAGE_STATE)
327+
self.assertEqual(parser.code, 200)
328+
self.assertEqual(parser.status, "OK")
329+
self.assertEqual(parser.version, netius.common.HTTP_11)
330+
self.assertEqual(parser.content_l, -1)
331+
self.assertEqual(message, b"Hello World")
332+
self.assertEqual(headers["Date"], "Wed, 1 Jan 2014 00:00:00 GMT")
333+
self.assertEqual(headers["Server"], "Test Service/1.0.0")
334+
335+
parser.parse_closed()
336+
self.assertEqual(parser.state, netius.common.http.FINISH_STATE)
337+
finally:
338+
parser.clear()

0 commit comments

Comments
 (0)