From 201eca4d02b5969a2eeaefd871804854b9273867 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 16 Jan 2025 03:39:04 +0800 Subject: [PATCH] Addon Manager: Improve proxy URL parsing & enhanced the error messaging (#19078) --- src/Mod/AddonManager/NetworkManager.py | 28 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/Mod/AddonManager/NetworkManager.py b/src/Mod/AddonManager/NetworkManager.py index 3d391e670b95..34b91d7f8887 100644 --- a/src/Mod/AddonManager/NetworkManager.py +++ b/src/Mod/AddonManager/NetworkManager.py @@ -60,6 +60,7 @@ import tempfile import sys from typing import Dict, List, Optional +from urllib.parse import urlparse try: import FreeCAD @@ -217,20 +218,32 @@ def _setup_proxy(self): if proxy and proxy[0]: self.QNAM.setProxy(proxy[0]) # This may still be QNetworkProxy.NoProxy elif userProxyCheck: - host, _, port_string = proxy_string.rpartition(":") try: - port = 0 if not port_string else int(port_string) + parsed_url = urlparse(proxy_string) + host = parsed_url.hostname + port = parsed_url.port + scheme = ( + "http" if parsed_url.scheme == "https" else parsed_url.scheme + ) # There seems no https type: doc.qt.io/qt-6/qnetworkproxy.html#ProxyType-enum except ValueError: FreeCAD.Console.PrintError( translate( "AddonsInstaller", - "Failed to convert the specified proxy port '{}' to a port number", - ).format(port_string) + "Failed to parse proxy URL '{}'", + ).format(proxy_string) + "\n" ) - port = 0 - # For now assume an HttpProxy, but eventually this should be a parameter - proxy = QtNetwork.QNetworkProxy(QtNetwork.QNetworkProxy.HttpProxy, host, port) + return + + FreeCAD.Console.PrintMessage(f"Using proxy {scheme}://{host}:{port} \n") + if scheme == "http": + _scheme = QtNetwork.QNetworkProxy.HttpProxy + elif scheme == "socks5": + _scheme = QtNetwork.QNetworkProxy.Socks5Proxy + else: + FreeCAD.Console.PrintWarning(f"Unknown proxy scheme '{scheme}', using http. \n") + _scheme = QtNetwork.QNetworkProxy.HttpProxy + proxy = QtNetwork.QNetworkProxy(_scheme, host, port) self.QNAM.setProxy(proxy) def _setup_proxy_freecad(self): @@ -602,6 +615,7 @@ def __reply_finished(self) -> None: data = reply.readAll() self.completed.emit(index, response_code, data) else: + FreeCAD.Console.PrintWarning(f"Request failed: {reply.error()} \n") if index in self.monitored_connections: self.progress_complete.emit(index, response_code, "") else: