From 41bd751ec2581331982c9d78b175467289fa2dec Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 6 Jan 2024 17:48:18 +0200 Subject: [PATCH] Implemente automatic installation of missing dependencies when utilizing a SOCKS proxy // Resolve #4822 --- HISTORY.rst | 1 + platformio/http.py | 6 ++---- platformio/pipdeps.py | 12 +++++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index dd40176f..bb5770ce 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -26,6 +26,7 @@ test-driven methodologies, and modern toolchains for unrivaled success. * Upgraded the build engine to the latest version of SCons (4.6.0) to improve build performance, reliability, and compatibility with other tools and systems (`release notes `__) * Enhanced the handling of built-in variables in |PIOCONF| during |INTERPOLATION| (`issue #4695 `_) * Enhanced PIP dependency declarations for improved reliability and extended support to include Python 3.6 (`issue #4819 `_) +* Implemented automatic installation of missing dependencies when utilizing a SOCKS proxy (`issue #4822 `_) * Implemented a fail-safe mechanism to terminate a debugging session if an unknown CLI option is passed (`issue #4699 `_) * Rectified an issue where ``${platformio.name}`` erroneously represented ``None`` as the default `project name `__ (`issue #4717 `_) * Resolved an issue where the ``COMPILATIONDB_INCLUDE_TOOLCHAIN`` setting was not correctly applying to private libraries (`issue #4762 `_) diff --git a/platformio/http.py b/platformio/http.py index ee67b631..563f982f 100644 --- a/platformio/http.py +++ b/platformio/http.py @@ -13,7 +13,6 @@ # limitations under the License. import json -import os import socket from urllib.parse import urljoin @@ -23,6 +22,7 @@ from urllib3.util.retry import Retry from platformio import __check_internet_hosts__, app, util from platformio.cache import ContentCache, cleanup_content_cache from platformio.exception import PlatformioException, UserSideException +from platformio.pipdeps import is_proxy_set __default_requests_timeout__ = (10, None) # (connect, read) @@ -191,9 +191,7 @@ def _internet_on(): socket.setdefaulttimeout(timeout) for host in __check_internet_hosts__: try: - for var in ("HTTP_PROXY", "HTTPS_PROXY"): - if not os.getenv(var) and not os.getenv(var.lower()): - continue + if is_proxy_set(): requests.get("http://%s" % host, allow_redirects=False, timeout=timeout) return True # try to resolve `host` for both AF_INET and AF_INET6, and then try to connect diff --git a/platformio/pipdeps.py b/platformio/pipdeps.py index f5512cde..e9674dda 100644 --- a/platformio/pipdeps.py +++ b/platformio/pipdeps.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import platform import sys @@ -26,7 +27,7 @@ def get_pip_dependencies(): "marshmallow == 3.*", "pyelftools == 0.30", "pyserial == 3.5.*", # keep in sync "device/monitor/terminal.py" - "requests == 2.*", + "requests%s == 2.*" % ("[socks]" if is_proxy_set(socks=True) else ""), "semantic_version == 2.10.*", "tabulate == 0.*", ] @@ -59,3 +60,12 @@ def get_pip_dependencies(): pass return core + home + extra + + +def is_proxy_set(socks=False): + for var in ("HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY"): + value = os.getenv(var, os.getenv(var.lower())) + if not value or (socks and not value.startswith("socks5://")): + continue + return True + return False