From dfcb824ae3e7752abf3c809a3f226cb21dd2187a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lum=C3=ADr=20=27Frenzy=27=20Balhar?= Date: Sun, 22 Jun 2025 07:49:14 +0200 Subject: [PATCH] tools: make nodedownload module compatible with Python 3.14 FancyURLopener and URLopener have been deprecated since Python 3.3 and they are removed completely from 3.14. Fixes: https://github.com/nodejs/node/issues/58740 PR-URL: https://github.com/nodejs/node/pull/58752 Reviewed-By: Luigi Pinca Reviewed-By: Yagiz Nizipli Reviewed-By: James M Snell --- tools/configure.d/nodedownload.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tools/configure.d/nodedownload.py b/tools/configure.d/nodedownload.py index 4f144e0e4b..0d65c33606 100644 --- a/tools/configure.d/nodedownload.py +++ b/tools/configure.d/nodedownload.py @@ -7,10 +7,7 @@ import sys import zipfile import tarfile import contextlib -try: - from urllib.request import FancyURLopener, URLopener -except ImportError: - from urllib import FancyURLopener, URLopener +from urllib.request import build_opener, install_opener, urlretrieve def formatSize(amt): """Format a size as a string in MB""" @@ -21,11 +18,6 @@ def spin(c): spin = ".:|'" return (spin[c % len(spin)]) -class ConfigOpener(FancyURLopener): - """fancy opener used by retrievefile. Set a UA""" - # append to existing version (UA) - version = '%s node.js/configure' % URLopener.version - def reporthook(count, size, total): """internal hook used by retrievefile""" sys.stdout.write(' Fetch: %c %sMB total, %sMB downloaded \r' % @@ -38,7 +30,10 @@ def retrievefile(url, targetfile): try: sys.stdout.write(' <%s>\nConnecting...\r' % url) sys.stdout.flush() - ConfigOpener().retrieve(url, targetfile, reporthook=reporthook) + opener = build_opener() + opener.addheaders = [('User-agent', f'Python-urllib/{sys.version_info.major}.{sys.version_info.minor} node.js/configure')] + install_opener(opener) + urlretrieve(url, targetfile, reporthook=reporthook) print('') # clear the line return targetfile except IOError as err: