Skip to content

Commit ad5e6eb

Browse files
authored
Fixes #1033 - Ensure that text that spans 3 invocations before newline is handled - don't clobber the buffer between invocations that haven't seen any lines. (#1034)
Fixes #1033 - Ensure that text that spans 3 invocations before newline is handled - don't clobber the buffer between invocations that haven't seen any lines.
1 parent 27b0dbc commit ad5e6eb

3 files changed

Lines changed: 30 additions & 2 deletions

File tree

httpx/_decoders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def decode(self, text: str) -> typing.List[str]:
261261
text = text[idx + 1 :]
262262
break
263263
elif next_char is None:
264-
self.buffer = text
264+
self.buffer += text
265265
text = ""
266266
break
267267

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ trustme
3131
uvicorn
3232
seed-isort-config
3333

34-
attrs>=19.2 # See: https://github.com/encode/httpx/pull/566#issuecomment-559862665
34+
attrs>=19.3.0 # See: https://github.com/encode/httpx/pull/566#issuecomment-559862665

tests/test_decoders.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ def test_line_decoder_nl():
225225
assert decoder.decode("a\n\nb\nc\n") == ["a\n", "\n", "b\n", "c\n"]
226226
assert decoder.flush() == []
227227

228+
# Issue #1033
229+
decoder = LineDecoder()
230+
assert decoder.decode("") == []
231+
assert decoder.decode("12345\n") == ["12345\n"]
232+
assert decoder.decode("foo ") == []
233+
assert decoder.decode("bar ") == []
234+
assert decoder.decode("baz\n") == ["foo bar baz\n"]
235+
assert decoder.flush() == []
236+
228237

229238
def test_line_decoder_cr():
230239
decoder = LineDecoder()
@@ -237,6 +246,16 @@ def test_line_decoder_cr():
237246
assert decoder.decode("a\r\rb\rc\r") == ["a\n", "\n", "b\n"]
238247
assert decoder.flush() == ["c\n"]
239248

249+
# Issue #1033
250+
# TODO: This seems like another bug; fix expectations and results.
251+
decoder = LineDecoder()
252+
assert decoder.decode("") == []
253+
assert decoder.decode("12345\r") == []
254+
assert decoder.decode("foo ") == []
255+
assert decoder.decode("bar ") == []
256+
assert decoder.decode("baz\r") == []
257+
assert decoder.flush() == ["12345\rfoo bar baz\n"]
258+
240259

241260
def test_line_decoder_crnl():
242261
decoder = LineDecoder()
@@ -255,6 +274,15 @@ def test_line_decoder_crnl():
255274
assert decoder.decode("\n\r\nb\r\nc") == ["a\n", "\n", "b\n"]
256275
assert decoder.flush() == ["c"]
257276

277+
# Issue #1033
278+
decoder = LineDecoder()
279+
assert decoder.decode("") == []
280+
assert decoder.decode("12345\r\n") == ["12345\n"]
281+
assert decoder.decode("foo ") == []
282+
assert decoder.decode("bar ") == []
283+
assert decoder.decode("baz\r\n") == ["foo bar baz\n"]
284+
assert decoder.flush() == []
285+
258286

259287
def test_invalid_content_encoding_header():
260288
headers = [(b"Content-Encoding", b"invalid-header")]

0 commit comments

Comments
 (0)