|
2 | 2 |
|
3 | 3 | import codecs |
4 | 4 | from functools import cached_property |
5 | | -from io import IOBase |
6 | 5 | from typing import TYPE_CHECKING |
7 | 6 | from urllib.parse import quote |
8 | 7 |
|
9 | 8 | from plain import signals |
10 | | -from plain.http import FileResponse, QueryDict, Request, parse_cookie |
| 9 | +from plain.http import FileResponse, LimitedStream, QueryDict, Request, parse_cookie |
11 | 10 | from plain.internal.handlers import base |
12 | 11 | from plain.utils.http import parse_header_parameters |
13 | 12 | from plain.utils.regex_helper import _lazy_re_compile |
@@ -41,47 +40,6 @@ def _extract_headers_from_environ(environ: dict[str, Any]) -> dict[str, str]: |
41 | 40 | return headers |
42 | 41 |
|
43 | 42 |
|
44 | | -class LimitedStream(IOBase): |
45 | | - """ |
46 | | - Wrap another stream to disallow reading it past a number of bytes. |
47 | | -
|
48 | | - Based on the implementation from werkzeug.wsgi.LimitedStream |
49 | | - See https://github.com/pallets/werkzeug/blob/dbf78f67/src/werkzeug/wsgi.py#L828 |
50 | | - """ |
51 | | - |
52 | | - def __init__(self, stream: Any, limit: int) -> None: |
53 | | - self._read = stream.read |
54 | | - self._readline = stream.readline |
55 | | - self._pos = 0 |
56 | | - self.limit = limit |
57 | | - |
58 | | - def read(self, size: int = -1, /) -> bytes: |
59 | | - _pos = self._pos |
60 | | - limit = self.limit |
61 | | - if _pos >= limit: |
62 | | - return b"" |
63 | | - if size == -1 or size is None: |
64 | | - size = limit - _pos |
65 | | - else: |
66 | | - size = min(size, limit - _pos) |
67 | | - data = self._read(size) |
68 | | - self._pos += len(data) |
69 | | - return data |
70 | | - |
71 | | - def readline(self, size: int | None = -1, /) -> bytes: |
72 | | - _pos = self._pos |
73 | | - limit = self.limit |
74 | | - if _pos >= limit: |
75 | | - return b"" |
76 | | - if size is None or size == -1: |
77 | | - size = limit - _pos |
78 | | - else: |
79 | | - size = min(size, limit - _pos) |
80 | | - line = self._readline(size) |
81 | | - self._pos += len(line) |
82 | | - return line |
83 | | - |
84 | | - |
85 | 43 | class WSGIRequest(Request): |
86 | 44 | non_picklable_attrs = Request.non_picklable_attrs | frozenset(["environ"]) |
87 | 45 |
|
|
0 commit comments