Skip to content

Commit d2da97d

Browse files
urllib: improve bytes handling (#9167)
1 parent dfa6a75 commit d2da97d

File tree

2 files changed

+41
-26
lines changed

2 files changed

+41
-26
lines changed

stdlib/urllib/parse.pyi

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ if sys.version_info >= (3, 9):
147147
else:
148148
def unquote(string: str, encoding: str = ..., errors: str = ...) -> str: ...
149149

150-
def unquote_to_bytes(string: str | bytes) -> bytes: ...
150+
def unquote_to_bytes(string: str | bytes | bytearray) -> bytes: ...
151151
def unquote_plus(string: str, encoding: str = ..., errors: str = ...) -> str: ...
152152
@overload
153153
def urldefrag(url: str) -> DefragResult: ...
@@ -168,11 +168,22 @@ def urljoin(base: AnyStr, url: AnyStr | None, allow_fragments: bool = ...) -> An
168168
@overload
169169
def urlparse(url: str, scheme: str | None = ..., allow_fragments: bool = ...) -> ParseResult: ...
170170
@overload
171-
def urlparse(url: bytes | bytearray | None, scheme: bytes | None = ..., allow_fragments: bool = ...) -> ParseResultBytes: ...
171+
def urlparse(
172+
url: bytes | bytearray | None, scheme: bytes | bytearray | None = ..., allow_fragments: bool = ...
173+
) -> ParseResultBytes: ...
172174
@overload
173175
def urlsplit(url: str, scheme: str | None = ..., allow_fragments: bool = ...) -> SplitResult: ...
174-
@overload
175-
def urlsplit(url: bytes | bytearray | None, scheme: bytes | None = ..., allow_fragments: bool = ...) -> SplitResultBytes: ...
176+
177+
if sys.version_info >= (3, 11):
178+
@overload
179+
def urlsplit(url: bytes | None, scheme: bytes | None = ..., allow_fragments: bool = ...) -> SplitResultBytes: ...
180+
181+
else:
182+
@overload
183+
def urlsplit(
184+
url: bytes | bytearray | None, scheme: bytes | bytearray | None = ..., allow_fragments: bool = ...
185+
) -> SplitResultBytes: ...
186+
176187
@overload
177188
def urlunparse(
178189
components: tuple[AnyStr | None, AnyStr | None, AnyStr | None, AnyStr | None, AnyStr | None, AnyStr | None]

stdlib/urllib/request.pyi

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import ssl
22
import sys
3-
from _typeshed import StrOrBytesPath, SupportsRead
3+
from _typeshed import ReadableBuffer, StrOrBytesPath, SupportsRead
44
from collections.abc import Callable, Iterable, Mapping, MutableMapping, Sequence
55
from email.message import Message
66
from http.client import HTTPConnection, HTTPMessage, HTTPResponse
@@ -50,7 +50,7 @@ __all__ = [
5050

5151
_T = TypeVar("_T")
5252
_UrlopenRet: TypeAlias = Any
53-
_DataType: TypeAlias = bytes | SupportsRead[bytes] | Iterable[bytes] | None
53+
_DataType: TypeAlias = ReadableBuffer | SupportsRead[bytes] | Iterable[bytes] | None
5454

5555
def urlopen(
5656
url: str | Request,
@@ -214,7 +214,7 @@ class AbstractDigestAuthHandler:
214214
def get_cnonce(self, nonce: str) -> str: ...
215215
def get_authorization(self, req: Request, chal: Mapping[str, str]) -> str: ...
216216
def get_algorithm_impls(self, algorithm: str) -> tuple[Callable[[str], str], Callable[[str, str], str]]: ...
217-
def get_entity_digest(self, data: bytes | None, chal: Mapping[str, str]) -> str | None: ...
217+
def get_entity_digest(self, data: ReadableBuffer | None, chal: Mapping[str, str]) -> str | None: ...
218218

219219
class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler):
220220
auth_header: ClassVar[str] # undocumented
@@ -301,14 +301,14 @@ def urlcleanup() -> None: ...
301301
class URLopener:
302302
version: ClassVar[str]
303303
def __init__(self, proxies: dict[str, str] | None = ..., **x509: str) -> None: ...
304-
def open(self, fullurl: str, data: bytes | None = ...) -> _UrlopenRet: ...
305-
def open_unknown(self, fullurl: str, data: bytes | None = ...) -> _UrlopenRet: ...
304+
def open(self, fullurl: str, data: ReadableBuffer | None = ...) -> _UrlopenRet: ...
305+
def open_unknown(self, fullurl: str, data: ReadableBuffer | None = ...) -> _UrlopenRet: ...
306306
def retrieve(
307307
self,
308308
url: str,
309309
filename: str | None = ...,
310310
reporthook: Callable[[int, int, int], object] | None = ...,
311-
data: bytes | None = ...,
311+
data: ReadableBuffer | None = ...,
312312
) -> tuple[str, Message | None]: ...
313313
def addheader(self, *args: tuple[str, str]) -> None: ... # undocumented
314314
def cleanup(self) -> None: ... # undocumented
@@ -319,32 +319,32 @@ class URLopener:
319319
def http_error_default(
320320
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
321321
) -> _UrlopenRet: ... # undocumented
322-
def open_data(self, url: str, data: bytes | None = ...) -> addinfourl: ... # undocumented
322+
def open_data(self, url: str, data: ReadableBuffer | None = ...) -> addinfourl: ... # undocumented
323323
def open_file(self, url: str) -> addinfourl: ... # undocumented
324324
def open_ftp(self, url: str) -> addinfourl: ... # undocumented
325-
def open_http(self, url: str, data: bytes | None = ...) -> _UrlopenRet: ... # undocumented
326-
def open_https(self, url: str, data: bytes | None = ...) -> _UrlopenRet: ... # undocumented
325+
def open_http(self, url: str, data: ReadableBuffer | None = ...) -> _UrlopenRet: ... # undocumented
326+
def open_https(self, url: str, data: ReadableBuffer | None = ...) -> _UrlopenRet: ... # undocumented
327327
def open_local_file(self, url: str) -> addinfourl: ... # undocumented
328-
def open_unknown_proxy(self, proxy: str, fullurl: str, data: bytes | None = ...) -> None: ... # undocumented
328+
def open_unknown_proxy(self, proxy: str, fullurl: str, data: ReadableBuffer | None = ...) -> None: ... # undocumented
329329

330330
class FancyURLopener(URLopener):
331331
def prompt_user_passwd(self, host: str, realm: str) -> tuple[str, str]: ...
332332
def get_user_passwd(self, host: str, realm: str, clear_cache: int = ...) -> tuple[str, str]: ... # undocumented
333333
def http_error_301(
334-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = ...
334+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = ...
335335
) -> _UrlopenRet | addinfourl | None: ... # undocumented
336336
def http_error_302(
337-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = ...
337+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = ...
338338
) -> _UrlopenRet | addinfourl | None: ... # undocumented
339339
def http_error_303(
340-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = ...
340+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = ...
341341
) -> _UrlopenRet | addinfourl | None: ... # undocumented
342342
def http_error_307(
343-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = ...
343+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = ...
344344
) -> _UrlopenRet | addinfourl | None: ... # undocumented
345345
if sys.version_info >= (3, 11):
346346
def http_error_308(
347-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = ...
347+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = ...
348348
) -> _UrlopenRet | addinfourl | None: ... # undocumented
349349

350350
def http_error_401(
@@ -354,7 +354,7 @@ class FancyURLopener(URLopener):
354354
errcode: int,
355355
errmsg: str,
356356
headers: HTTPMessage,
357-
data: bytes | None = ...,
357+
data: ReadableBuffer | None = ...,
358358
retry: bool = ...,
359359
) -> _UrlopenRet | None: ... # undocumented
360360
def http_error_407(
@@ -364,20 +364,24 @@ class FancyURLopener(URLopener):
364364
errcode: int,
365365
errmsg: str,
366366
headers: HTTPMessage,
367-
data: bytes | None = ...,
367+
data: ReadableBuffer | None = ...,
368368
retry: bool = ...,
369369
) -> _UrlopenRet | None: ... # undocumented
370370
def http_error_default(
371371
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
372372
) -> addinfourl: ... # undocumented
373373
def redirect_internal(
374-
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None
374+
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None
375+
) -> _UrlopenRet | None: ... # undocumented
376+
def retry_http_basic_auth(
377+
self, url: str, realm: str, data: ReadableBuffer | None = ...
378+
) -> _UrlopenRet | None: ... # undocumented
379+
def retry_https_basic_auth(
380+
self, url: str, realm: str, data: ReadableBuffer | None = ...
375381
) -> _UrlopenRet | None: ... # undocumented
376-
def retry_http_basic_auth(self, url: str, realm: str, data: bytes | None = ...) -> _UrlopenRet | None: ... # undocumented
377-
def retry_https_basic_auth(self, url: str, realm: str, data: bytes | None = ...) -> _UrlopenRet | None: ... # undocumented
378382
def retry_proxy_http_basic_auth(
379-
self, url: str, realm: str, data: bytes | None = ...
383+
self, url: str, realm: str, data: ReadableBuffer | None = ...
380384
) -> _UrlopenRet | None: ... # undocumented
381385
def retry_proxy_https_basic_auth(
382-
self, url: str, realm: str, data: bytes | None = ...
386+
self, url: str, realm: str, data: ReadableBuffer | None = ...
383387
) -> _UrlopenRet | None: ... # undocumented

0 commit comments

Comments
 (0)