123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- 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
- ################################################################
- # maybe_extract_until_next
- ################################################################
- 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"
- # here we stopped at the middle of b"\r\n" delimiter
- 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""
- ################################################################
- # maybe_extract_lines
- ################################################################
- 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
- # Empty body case (as happens at the end of chunked encoding if there are
- # no trailing headers, e.g.)
- 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"
|