test_receivebuffer.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import re
  2. from typing import Tuple
  3. import pytest
  4. from .._receivebuffer import ReceiveBuffer
  5. def test_receivebuffer() -> None:
  6. b = ReceiveBuffer()
  7. assert not b
  8. assert len(b) == 0
  9. assert bytes(b) == b""
  10. b += b"123"
  11. assert b
  12. assert len(b) == 3
  13. assert bytes(b) == b"123"
  14. assert bytes(b) == b"123"
  15. assert b.maybe_extract_at_most(2) == b"12"
  16. assert b
  17. assert len(b) == 1
  18. assert bytes(b) == b"3"
  19. assert bytes(b) == b"3"
  20. assert b.maybe_extract_at_most(10) == b"3"
  21. assert bytes(b) == b""
  22. assert b.maybe_extract_at_most(10) is None
  23. assert not b
  24. ################################################################
  25. # maybe_extract_until_next
  26. ################################################################
  27. b += b"123\n456\r\n789\r\n"
  28. assert b.maybe_extract_next_line() == b"123\n456\r\n"
  29. assert bytes(b) == b"789\r\n"
  30. assert b.maybe_extract_next_line() == b"789\r\n"
  31. assert bytes(b) == b""
  32. b += b"12\r"
  33. assert b.maybe_extract_next_line() is None
  34. assert bytes(b) == b"12\r"
  35. b += b"345\n\r"
  36. assert b.maybe_extract_next_line() is None
  37. assert bytes(b) == b"12\r345\n\r"
  38. # here we stopped at the middle of b"\r\n" delimiter
  39. b += b"\n6789aaa123\r\n"
  40. assert b.maybe_extract_next_line() == b"12\r345\n\r\n"
  41. assert b.maybe_extract_next_line() == b"6789aaa123\r\n"
  42. assert b.maybe_extract_next_line() is None
  43. assert bytes(b) == b""
  44. ################################################################
  45. # maybe_extract_lines
  46. ################################################################
  47. b += b"123\r\na: b\r\nfoo:bar\r\n\r\ntrailing"
  48. lines = b.maybe_extract_lines()
  49. assert lines == [b"123", b"a: b", b"foo:bar"]
  50. assert bytes(b) == b"trailing"
  51. assert b.maybe_extract_lines() is None
  52. b += b"\r\n\r"
  53. assert b.maybe_extract_lines() is None
  54. assert b.maybe_extract_at_most(100) == b"trailing\r\n\r"
  55. assert not b
  56. # Empty body case (as happens at the end of chunked encoding if there are
  57. # no trailing headers, e.g.)
  58. b += b"\r\ntrailing"
  59. assert b.maybe_extract_lines() == []
  60. assert bytes(b) == b"trailing"
  61. @pytest.mark.parametrize(
  62. "data",
  63. [
  64. pytest.param(
  65. (
  66. b"HTTP/1.1 200 OK\r\n",
  67. b"Content-type: text/plain\r\n",
  68. b"Connection: close\r\n",
  69. b"\r\n",
  70. b"Some body",
  71. ),
  72. id="with_crlf_delimiter",
  73. ),
  74. pytest.param(
  75. (
  76. b"HTTP/1.1 200 OK\n",
  77. b"Content-type: text/plain\n",
  78. b"Connection: close\n",
  79. b"\n",
  80. b"Some body",
  81. ),
  82. id="with_lf_only_delimiter",
  83. ),
  84. pytest.param(
  85. (
  86. b"HTTP/1.1 200 OK\n",
  87. b"Content-type: text/plain\r\n",
  88. b"Connection: close\n",
  89. b"\n",
  90. b"Some body",
  91. ),
  92. id="with_mixed_crlf_and_lf",
  93. ),
  94. ],
  95. )
  96. def test_receivebuffer_for_invalid_delimiter(data: Tuple[bytes]) -> None:
  97. b = ReceiveBuffer()
  98. for line in data:
  99. b += line
  100. lines = b.maybe_extract_lines()
  101. assert lines == [
  102. b"HTTP/1.1 200 OK",
  103. b"Content-type: text/plain",
  104. b"Connection: close",
  105. ]
  106. assert bytes(b) == b"Some body"