From 6f0e3808a54692e60d27136901c99d717a1e0654 Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 2 Jul 2026 18:32:41 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?venv/Lib/site-packages/httptools/parser=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/url_parser.cp314-win_amd64.pyd | Bin 0 -> 52224 bytes .../httptools/parser/url_parser.pyi | 13 ++ .../httptools/parser/url_parser.pyx | 118 ++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 venv/Lib/site-packages/httptools/parser/url_parser.cp314-win_amd64.pyd create mode 100644 venv/Lib/site-packages/httptools/parser/url_parser.pyi create mode 100644 venv/Lib/site-packages/httptools/parser/url_parser.pyx diff --git a/venv/Lib/site-packages/httptools/parser/url_parser.cp314-win_amd64.pyd b/venv/Lib/site-packages/httptools/parser/url_parser.cp314-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..70b6a7e2cf96e0b5bb20cf95caaf932c5a8f8f6c GIT binary patch literal 52224 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/httptools/parser/url_parser.pyi b/venv/Lib/site-packages/httptools/parser/url_parser.pyi new file mode 100644 index 0000000..d848445 --- /dev/null +++ b/venv/Lib/site-packages/httptools/parser/url_parser.pyi @@ -0,0 +1,13 @@ +from array import array + +class URL: + schema: bytes + host: bytes + port: int + path: bytes + query: bytes + fragment: bytes + userinfo: bytes + +def parse_url(url: bytes | bytearray | memoryview | array[int]) -> URL: + """Parse a URL string into a structured Python object.""" diff --git a/venv/Lib/site-packages/httptools/parser/url_parser.pyx b/venv/Lib/site-packages/httptools/parser/url_parser.pyx new file mode 100644 index 0000000..5e82208 --- /dev/null +++ b/venv/Lib/site-packages/httptools/parser/url_parser.pyx @@ -0,0 +1,118 @@ +#cython: language_level=3 + +from __future__ import print_function +from cpython.mem cimport PyMem_Malloc, PyMem_Free +from cpython cimport PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE, \ + Py_buffer + +from .errors import HttpParserInvalidURLError + +cimport cython +from . cimport url_cparser as uparser + +__all__ = ('parse_url',) + +DEF MAX_URL_LENGTH = (1 << 16) - 1 + +@cython.freelist(250) +cdef class URL: + cdef readonly bytes schema + cdef readonly bytes host + cdef readonly object port + cdef readonly bytes path + cdef readonly bytes query + cdef readonly bytes fragment + cdef readonly bytes userinfo + + def __cinit__(self, bytes schema, bytes host, object port, bytes path, + bytes query, bytes fragment, bytes userinfo): + + self.schema = schema + self.host = host + self.port = port + self.path = path + self.query = query + self.fragment = fragment + self.userinfo = userinfo + + def __repr__(self): + return ('' + .format(self.schema, self.host, self.port, self.path, + self.query, self.fragment, self.userinfo)) + + +def parse_url(url): + cdef: + Py_buffer py_buf + char* buf_data + uparser.http_parser_url* parsed + int res + bytes schema = None + bytes host = None + object port = None + bytes path = None + bytes query = None + bytes fragment = None + bytes userinfo = None + object result = None + int off + int ln + + parsed = \ + PyMem_Malloc(sizeof(uparser.http_parser_url)) + uparser.http_parser_url_init(parsed) + + PyObject_GetBuffer(url, &py_buf, PyBUF_SIMPLE) + try: + if py_buf.len > MAX_URL_LENGTH: + # http_parser stores URL field offsets/lengths as uint16_t, + # so URLs longer than this will cause silent truncation. + # See https://github.com/MagicStack/httptools/issues/142 + raise HttpParserInvalidURLError( + "url is too long: url length of {} bytes exceeds the " + "maximum of {} bytes".format(py_buf.len, MAX_URL_LENGTH)) + + buf_data = py_buf.buf + res = uparser.http_parser_parse_url(buf_data, py_buf.len, 0, parsed) + + if res == 0: + if parsed.field_set & (1 << uparser.UF_SCHEMA): + off = parsed.field_data[uparser.UF_SCHEMA].off + ln = parsed.field_data[uparser.UF_SCHEMA].len + schema = buf_data[off:off+ln] + + if parsed.field_set & (1 << uparser.UF_HOST): + off = parsed.field_data[uparser.UF_HOST].off + ln = parsed.field_data[uparser.UF_HOST].len + host = buf_data[off:off+ln] + + if parsed.field_set & (1 << uparser.UF_PORT): + port = parsed.port + + if parsed.field_set & (1 << uparser.UF_PATH): + off = parsed.field_data[uparser.UF_PATH].off + ln = parsed.field_data[uparser.UF_PATH].len + path = buf_data[off:off+ln] + + if parsed.field_set & (1 << uparser.UF_QUERY): + off = parsed.field_data[uparser.UF_QUERY].off + ln = parsed.field_data[uparser.UF_QUERY].len + query = buf_data[off:off+ln] + + if parsed.field_set & (1 << uparser.UF_FRAGMENT): + off = parsed.field_data[uparser.UF_FRAGMENT].off + ln = parsed.field_data[uparser.UF_FRAGMENT].len + fragment = buf_data[off:off+ln] + + if parsed.field_set & (1 << uparser.UF_USERINFO): + off = parsed.field_data[uparser.UF_USERINFO].off + ln = parsed.field_data[uparser.UF_USERINFO].len + userinfo = buf_data[off:off+ln] + + return URL(schema, host, port, path, query, fragment, userinfo) + else: + raise HttpParserInvalidURLError("invalid url {!r}".format(url)) + finally: + PyBuffer_Release(&py_buf) + PyMem_Free(parsed)