Skip to content

Commit 5297b1d

Browse files
authored
Merge pull request #78 from mrstegeman/fix-204-parsing
Fix parsing of "204 No Content" messages.
2 parents 2306df2 + df7b714 commit 5297b1d

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ nohup.out
1919
doc/.sass-cache
2020
http_parser/__pycache__
2121
MANIFEST
22+
.pytest_cache/

http_parser/pyparser.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ def execute(self, data, length):
222222
try:
223223
to_parse = b("").join(self._buf)
224224
ret = self._parse_headers(to_parse)
225-
if not ret:
225+
if type(ret) is bool and not ret:
226226
return length
227227
nb_parsed = nb_parsed + (len(to_parse) - ret)
228228
except InvalidHeader as e:
@@ -324,7 +324,12 @@ def _parse_request_line(self, line):
324324
def _parse_headers(self, data):
325325
idx = data.find(b("\r\n\r\n"))
326326
if idx < 0: # we don't have all headers
327-
return False
327+
if self._status_code == 204 and data == b("\r\n"):
328+
self._buf = []
329+
self.__on_headers_complete = True
330+
return 0
331+
else:
332+
return False
328333

329334
# Split lines on \r\n keeping the \r\n on each line
330335
lines = [bytes_to_str(line) + "\r\n" for line in
@@ -395,7 +400,10 @@ def _parse_headers(self, data):
395400
return len(rest)
396401

397402
def _parse_body(self):
398-
if not self._chunked:
403+
if self._status_code == 204 and len(self._buf) == 0:
404+
self.__on_message_complete = True
405+
return
406+
elif not self._chunked:
399407
body_part = b("").join(self._buf)
400408
self._clen_rest -= len(body_part)
401409

testing/test_response.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import pytest
2+
import io
3+
4+
from http_parser.http import HttpStream
5+
from http_parser.pyparser import HttpParser as PyHttpParser
6+
7+
8+
def test_204_no_content():
9+
stream = io.BytesIO(b'HTTP/1.1 204 No Content\r\n\r\n')
10+
response = HttpStream(stream)
11+
assert response.status_code() == 204
12+
assert response.body_string() == b''

0 commit comments

Comments
 (0)