From: Sheridan C Rawlins Date: Tue, 21 Jul 2020 09:33:45 +0000 (-0700) Subject: Fixes #1033 - Ensure that text that spans 3 invocations before newline is handled... X-Git-Tag: 0.14.0~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad5e6eb8b0bd4a23218f835cf70025f2f7897cc0;p=thirdparty%2Fhttpx.git 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. --- diff --git a/httpx/_decoders.py b/httpx/_decoders.py index 2a2e703d..1ea47b00 100644 --- a/httpx/_decoders.py +++ b/httpx/_decoders.py @@ -261,7 +261,7 @@ class LineDecoder: text = text[idx + 1 :] break elif next_char is None: - self.buffer = text + self.buffer += text text = "" break diff --git a/requirements.txt b/requirements.txt index 246a08e1..42607063 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,4 +31,4 @@ trustme uvicorn seed-isort-config -attrs>=19.2 # See: https://github.com/encode/httpx/pull/566#issuecomment-559862665 +attrs>=19.3.0 # See: https://github.com/encode/httpx/pull/566#issuecomment-559862665 diff --git a/tests/test_decoders.py b/tests/test_decoders.py index 9f2fa510..89c545b5 100644 --- a/tests/test_decoders.py +++ b/tests/test_decoders.py @@ -225,6 +225,15 @@ def test_line_decoder_nl(): assert decoder.decode("a\n\nb\nc\n") == ["a\n", "\n", "b\n", "c\n"] assert decoder.flush() == [] + # Issue #1033 + decoder = LineDecoder() + assert decoder.decode("") == [] + assert decoder.decode("12345\n") == ["12345\n"] + assert decoder.decode("foo ") == [] + assert decoder.decode("bar ") == [] + assert decoder.decode("baz\n") == ["foo bar baz\n"] + assert decoder.flush() == [] + def test_line_decoder_cr(): decoder = LineDecoder() @@ -237,6 +246,16 @@ def test_line_decoder_cr(): assert decoder.decode("a\r\rb\rc\r") == ["a\n", "\n", "b\n"] assert decoder.flush() == ["c\n"] + # Issue #1033 + # TODO: This seems like another bug; fix expectations and results. + decoder = LineDecoder() + assert decoder.decode("") == [] + assert decoder.decode("12345\r") == [] + assert decoder.decode("foo ") == [] + assert decoder.decode("bar ") == [] + assert decoder.decode("baz\r") == [] + assert decoder.flush() == ["12345\rfoo bar baz\n"] + def test_line_decoder_crnl(): decoder = LineDecoder() @@ -255,6 +274,15 @@ def test_line_decoder_crnl(): assert decoder.decode("\n\r\nb\r\nc") == ["a\n", "\n", "b\n"] assert decoder.flush() == ["c"] + # Issue #1033 + decoder = LineDecoder() + assert decoder.decode("") == [] + assert decoder.decode("12345\r\n") == ["12345\n"] + assert decoder.decode("foo ") == [] + assert decoder.decode("bar ") == [] + assert decoder.decode("baz\r\n") == ["foo bar baz\n"] + assert decoder.flush() == [] + def test_invalid_content_encoding_header(): headers = [(b"Content-Encoding", b"invalid-header")]