Skip to content

Bump urllib.request to 3.14 #14062

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions stdlib/@tests/stubtest_allowlists/py314.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,6 @@ turtle.poly
turtle.save
types.CodeType.co_branches
types.FrameType.f_generator
urllib.request.__all__
urllib.request.FancyURLopener
urllib.request.URLopener
urllib.request.pathname2url
urllib.request.url2pathname
xml.parsers.expat.errors.XML_ERROR_NOT_STARTED
xml.sax.__all__
xml.sax.InputSource
Expand Down
194 changes: 101 additions & 93 deletions stdlib/urllib/request.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ from http.client import HTTPConnection, HTTPMessage, HTTPResponse
from http.cookiejar import CookieJar
from re import Pattern
from typing import IO, Any, ClassVar, NoReturn, Protocol, TypeVar, overload
from typing_extensions import TypeAlias
from typing_extensions import TypeAlias, deprecated
from urllib.error import HTTPError as HTTPError
from urllib.response import addclosehook, addinfourl

Expand Down Expand Up @@ -43,10 +43,10 @@ __all__ = [
"getproxies",
"urlretrieve",
"urlcleanup",
"URLopener",
"FancyURLopener",
"HTTPSHandler",
]
if sys.version_info < (3, 14):
__all__ += ["URLopener", "FancyURLopener"]

_T = TypeVar("_T")
_UrlopenRet: TypeAlias = Any
Expand All @@ -72,11 +72,16 @@ else:
def install_opener(opener: OpenerDirector) -> None: ...
def build_opener(*handlers: BaseHandler | Callable[[], BaseHandler]) -> OpenerDirector: ...

if sys.platform == "win32":
from nturl2path import pathname2url as pathname2url, url2pathname as url2pathname
if sys.version_info >= (3, 14):
def url2pathname(url: str, *, require_scheme: bool = False, resolve_host: bool = False) -> str: ...
def pathname2url(pathname: str, *, add_scheme: bool = False) -> str: ...

else:
def url2pathname(pathname: str) -> str: ...
def pathname2url(pathname: str) -> str: ...
if sys.platform == "win32":
from nturl2path import pathname2url as pathname2url, url2pathname as url2pathname
else:
def url2pathname(pathname: str) -> str: ...
def pathname2url(pathname: str) -> str: ...

def getproxies() -> dict[str, str]: ...
def getproxies_environment() -> dict[str, str]: ...
Expand Down Expand Up @@ -318,91 +323,94 @@ def urlretrieve(
) -> tuple[str, HTTPMessage]: ...
def urlcleanup() -> None: ...

class URLopener:
version: ClassVar[str]
def __init__(self, proxies: dict[str, str] | None = None, **x509: str) -> None: ...
def open(self, fullurl: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ...
def open_unknown(self, fullurl: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ...
def retrieve(
self,
url: str,
filename: str | None = None,
reporthook: Callable[[int, int, int], object] | None = None,
data: ReadableBuffer | None = None,
) -> tuple[str, Message | None]: ...
def addheader(self, *args: tuple[str, str]) -> None: ... # undocumented
def cleanup(self) -> None: ... # undocumented
def close(self) -> None: ... # undocumented
def http_error(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = None
) -> _UrlopenRet: ... # undocumented
def http_error_default(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
) -> _UrlopenRet: ... # undocumented
def open_data(self, url: str, data: ReadableBuffer | None = None) -> addinfourl: ... # undocumented
def open_file(self, url: str) -> addinfourl: ... # undocumented
def open_ftp(self, url: str) -> addinfourl: ... # undocumented
def open_http(self, url: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ... # undocumented
def open_https(self, url: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ... # undocumented
def open_local_file(self, url: str) -> addinfourl: ... # undocumented
def open_unknown_proxy(self, proxy: str, fullurl: str, data: ReadableBuffer | None = None) -> None: ... # undocumented
def __del__(self) -> None: ...

class FancyURLopener(URLopener):
def prompt_user_passwd(self, host: str, realm: str) -> tuple[str, str]: ...
def get_user_passwd(self, host: str, realm: str, clear_cache: int = 0) -> tuple[str, str]: ... # undocumented
def http_error_301(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
def http_error_302(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
def http_error_303(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
def http_error_307(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
if sys.version_info >= (3, 11):
def http_error_308(
if sys.version_info < (3, 14):
@deprecated("Deprecated since Python 3.3; Removed in 3.14; Use newer urlopen functions and methods.")
class URLopener:
version: ClassVar[str]
def __init__(self, proxies: dict[str, str] | None = None, **x509: str) -> None: ...
def open(self, fullurl: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ...
def open_unknown(self, fullurl: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ...
def retrieve(
self,
url: str,
filename: str | None = None,
reporthook: Callable[[int, int, int], object] | None = None,
data: ReadableBuffer | None = None,
) -> tuple[str, Message | None]: ...
def addheader(self, *args: tuple[str, str]) -> None: ... # undocumented
def cleanup(self) -> None: ... # undocumented
def close(self) -> None: ... # undocumented
def http_error(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: bytes | None = None
) -> _UrlopenRet: ... # undocumented
def http_error_default(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
) -> _UrlopenRet: ... # undocumented
def open_data(self, url: str, data: ReadableBuffer | None = None) -> addinfourl: ... # undocumented
def open_file(self, url: str) -> addinfourl: ... # undocumented
def open_ftp(self, url: str) -> addinfourl: ... # undocumented
def open_http(self, url: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ... # undocumented
def open_https(self, url: str, data: ReadableBuffer | None = None) -> _UrlopenRet: ... # undocumented
def open_local_file(self, url: str) -> addinfourl: ... # undocumented
def open_unknown_proxy(self, proxy: str, fullurl: str, data: ReadableBuffer | None = None) -> None: ... # undocumented
def __del__(self) -> None: ...

@deprecated("Deprecated since Python 3.3; Removed in 3.14; Use newer urlopen functions and methods.")
class FancyURLopener(URLopener):
def prompt_user_passwd(self, host: str, realm: str) -> tuple[str, str]: ...
def get_user_passwd(self, host: str, realm: str, clear_cache: int = 0) -> tuple[str, str]: ... # undocumented
def http_error_301(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented

def http_error_401(
self,
url: str,
fp: IO[bytes],
errcode: int,
errmsg: str,
headers: HTTPMessage,
data: ReadableBuffer | None = None,
retry: bool = False,
) -> _UrlopenRet | None: ... # undocumented
def http_error_407(
self,
url: str,
fp: IO[bytes],
errcode: int,
errmsg: str,
headers: HTTPMessage,
data: ReadableBuffer | None = None,
retry: bool = False,
) -> _UrlopenRet | None: ... # undocumented
def http_error_default(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
) -> addinfourl: ... # undocumented
def redirect_internal(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None
) -> _UrlopenRet | None: ... # undocumented
def retry_http_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_https_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_proxy_http_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_proxy_https_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def http_error_302(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
def http_error_303(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
def http_error_307(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented
if sys.version_info >= (3, 11):
def http_error_308(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None = None
) -> _UrlopenRet | addinfourl | None: ... # undocumented

def http_error_401(
self,
url: str,
fp: IO[bytes],
errcode: int,
errmsg: str,
headers: HTTPMessage,
data: ReadableBuffer | None = None,
retry: bool = False,
) -> _UrlopenRet | None: ... # undocumented
def http_error_407(
self,
url: str,
fp: IO[bytes],
errcode: int,
errmsg: str,
headers: HTTPMessage,
data: ReadableBuffer | None = None,
retry: bool = False,
) -> _UrlopenRet | None: ... # undocumented
def http_error_default(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage
) -> addinfourl: ... # undocumented
def redirect_internal(
self, url: str, fp: IO[bytes], errcode: int, errmsg: str, headers: HTTPMessage, data: ReadableBuffer | None
) -> _UrlopenRet | None: ... # undocumented
def retry_http_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_https_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_proxy_http_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
def retry_proxy_https_basic_auth(
self, url: str, realm: str, data: ReadableBuffer | None = None
) -> _UrlopenRet | None: ... # undocumented
7 changes: 5 additions & 2 deletions stubs/six/six/moves/urllib/request.pyi
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import sys

# Stubs for six.moves.urllib.request
#
# Note: Commented out items means they weren't implemented at the time.
Expand All @@ -8,7 +10,6 @@ from urllib.request import (
AbstractDigestAuthHandler as AbstractDigestAuthHandler,
BaseHandler as BaseHandler,
CacheFTPHandler as CacheFTPHandler,
FancyURLopener as FancyURLopener,
FileHandler as FileHandler,
FTPHandler as FTPHandler,
HTTPBasicAuthHandler as HTTPBasicAuthHandler,
Expand All @@ -27,7 +28,6 @@ from urllib.request import (
ProxyHandler as ProxyHandler,
Request as Request,
UnknownHandler as UnknownHandler,
URLopener as URLopener,
build_opener as build_opener,
getproxies as getproxies,
install_opener as install_opener,
Expand All @@ -39,3 +39,6 @@ from urllib.request import (
urlopen as urlopen,
urlretrieve as urlretrieve,
)

if sys.version_info < (3, 14):
from urllib.request import FancyURLopener as FancyURLopener, URLopener as URLopener