]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Fixes #1033 - Ensure that text that spans 3 invocations before newline is handled...
authorSheridan C Rawlins <sheridan.rawlins@yahoo.com>
Tue, 21 Jul 2020 09:33:45 +0000 (02:33 -0700)
committerGitHub <noreply@github.com>
Tue, 21 Jul 2020 09:33:45 +0000 (10:33 +0100)
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.

httpx/_decoders.py
requirements.txt
tests/test_decoders.py

index 2a2e703d17a8c85cf4c6e62b437be78ae86fd293..1ea47b00048726984aff9438899e5409da7081d0 100644 (file)
@@ -261,7 +261,7 @@ class LineDecoder:
                     text = text[idx + 1 :]
                     break
                 elif next_char is None:
-                    self.buffer = text
+                    self.buffer += text
                     text = ""
                     break
 
index 246a08e1bd3c805c7dbc7f02265ba4cac01b544e..42607063ceb272952906d30707ae5d3137468b3e 100644 (file)
@@ -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
index 9f2fa51032bc718d58d5c9f9a41f27a8fc8ccba3..89c545b5a41eb732fdde2870e7b8e073d64cbdc9 100644 (file)
@@ -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")]