| import re |
| from typing import Tuple |
|
|
| import pytest |
|
|
| from .._receivebuffer import ReceiveBuffer |
|
|
|
|
| def test_receivebuffer() -> None: |
| b = ReceiveBuffer() |
| assert not b |
| assert len(b) == 0 |
| assert bytes(b) == b"" |
|
|
| b += b"123" |
| assert b |
| assert len(b) == 3 |
| assert bytes(b) == b"123" |
|
|
| assert bytes(b) == b"123" |
|
|
| assert b.maybe_extract_at_most(2) == b"12" |
| assert b |
| assert len(b) == 1 |
| assert bytes(b) == b"3" |
|
|
| assert bytes(b) == b"3" |
|
|
| assert b.maybe_extract_at_most(10) == b"3" |
| assert bytes(b) == b"" |
|
|
| assert b.maybe_extract_at_most(10) is None |
| assert not b |
|
|
| |
| |
| |
|
|
| b += b"123\n456\r\n789\r\n" |
|
|
| assert b.maybe_extract_next_line() == b"123\n456\r\n" |
| assert bytes(b) == b"789\r\n" |
|
|
| assert b.maybe_extract_next_line() == b"789\r\n" |
| assert bytes(b) == b"" |
|
|
| b += b"12\r" |
| assert b.maybe_extract_next_line() is None |
| assert bytes(b) == b"12\r" |
|
|
| b += b"345\n\r" |
| assert b.maybe_extract_next_line() is None |
| assert bytes(b) == b"12\r345\n\r" |
|
|
| |
|
|
| b += b"\n6789aaa123\r\n" |
| assert b.maybe_extract_next_line() == b"12\r345\n\r\n" |
| assert b.maybe_extract_next_line() == b"6789aaa123\r\n" |
| assert b.maybe_extract_next_line() is None |
| assert bytes(b) == b"" |
|
|
| |
| |
| |
|
|
| b += b"123\r\na: b\r\nfoo:bar\r\n\r\ntrailing" |
| lines = b.maybe_extract_lines() |
| assert lines == [b"123", b"a: b", b"foo:bar"] |
| assert bytes(b) == b"trailing" |
|
|
| assert b.maybe_extract_lines() is None |
|
|
| b += b"\r\n\r" |
| assert b.maybe_extract_lines() is None |
|
|
| assert b.maybe_extract_at_most(100) == b"trailing\r\n\r" |
| assert not b |
|
|
| |
| |
| b += b"\r\ntrailing" |
| assert b.maybe_extract_lines() == [] |
| assert bytes(b) == b"trailing" |
|
|
|
|
| @pytest.mark.parametrize( |
| "data", |
| [ |
| pytest.param( |
| ( |
| b"HTTP/1.1 200 OK\r\n", |
| b"Content-type: text/plain\r\n", |
| b"Connection: close\r\n", |
| b"\r\n", |
| b"Some body", |
| ), |
| id="with_crlf_delimiter", |
| ), |
| pytest.param( |
| ( |
| b"HTTP/1.1 200 OK\n", |
| b"Content-type: text/plain\n", |
| b"Connection: close\n", |
| b"\n", |
| b"Some body", |
| ), |
| id="with_lf_only_delimiter", |
| ), |
| pytest.param( |
| ( |
| b"HTTP/1.1 200 OK\n", |
| b"Content-type: text/plain\r\n", |
| b"Connection: close\n", |
| b"\n", |
| b"Some body", |
| ), |
| id="with_mixed_crlf_and_lf", |
| ), |
| ], |
| ) |
| def test_receivebuffer_for_invalid_delimiter(data: Tuple[bytes]) -> None: |
| b = ReceiveBuffer() |
|
|
| for line in data: |
| b += line |
|
|
| lines = b.maybe_extract_lines() |
|
|
| assert lines == [ |
| b"HTTP/1.1 200 OK", |
| b"Content-type: text/plain", |
| b"Connection: close", |
| ] |
| assert bytes(b) == b"Some body" |
|
|