From 7c969f4235aa052234084c3cb951d485c6fff9cd Mon Sep 17 00:00:00 2001 From: Gauthier Date: Fri, 13 Jun 2025 23:00:26 +0200 Subject: [PATCH] fix(proxy): apply http proxy settings to axios (#1716) This PR apply the HTTP(S) proxy settings defined in the Jellyseerr network tab to Axios because Axios doesn't use the proxy settings from Undici. --- package.json | 6 ++++-- pnpm-lock.yaml | 32 ++++++++++++++++++++++---------- server/utils/customProxyAgent.ts | 24 +++++++++++++++++++----- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 328ec62d1..a3caf98ac 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "@supercharge/request-ip": "1.2.0", "@svgr/webpack": "6.5.1", "@tanem/react-nprogress": "5.0.30", - "@types/wink-jaro-distance": "^2.0.2", "@types/ua-parser-js": "^0.7.36", + "@types/wink-jaro-distance": "^2.0.2", "ace-builds": "1.15.2", "axios": "1.3.4", "axios-rate-limit": "1.3.0", @@ -65,6 +65,8 @@ "express-session": "1.17.3", "formik": "^2.4.6", "gravatar-url": "3.1.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "lodash": "4.17.21", "mime": "3", "next": "^14.2.25", @@ -101,8 +103,8 @@ "swr": "2.2.5", "tailwind-merge": "^2.6.0", "typeorm": "0.3.12", - "undici": "^7.3.0", "ua-parser-js": "^1.0.35", + "undici": "^7.3.0", "web-push": "3.5.0", "wink-jaro-distance": "^2.0.0", "winston": "3.8.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 552fde069..812cfd385 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,6 +107,12 @@ importers: gravatar-url: specifier: 3.1.0 version: 3.1.0 + http-proxy-agent: + specifier: ^7.0.2 + version: 7.0.2 + https-proxy-agent: + specifier: ^7.0.6 + version: 7.0.6 lodash: specifier: 4.17.21 version: 4.17.21 @@ -3626,6 +3632,10 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -5788,8 +5798,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} human-signals@1.1.1: @@ -11122,7 +11132,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.5 + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -13339,7 +13349,7 @@ snapshots: fs-extra: 11.2.0 globby: 11.1.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 issue-parser: 6.0.0 lodash: 4.17.21 mime: 3.0.0 @@ -13961,7 +13971,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.5 + debug: 4.4.0(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -14052,10 +14062,12 @@ snapshots: agent-base@7.1.1: dependencies: - debug: 4.3.5 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color + agent-base@7.1.3: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 @@ -16821,7 +16833,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16848,10 +16860,10 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 - debug: 4.3.5 + agent-base: 7.1.3 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color diff --git a/server/utils/customProxyAgent.ts b/server/utils/customProxyAgent.ts index 040ac5cd9..309181501 100644 --- a/server/utils/customProxyAgent.ts +++ b/server/utils/customProxyAgent.ts @@ -1,6 +1,8 @@ import type { ProxySettings } from '@server/lib/settings'; import logger from '@server/logger'; import axios from 'axios'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import { HttpsProxyAgent } from 'https-proxy-agent'; import type { Dispatcher } from 'undici'; import { Agent, ProxyAgent, setGlobalDispatcher } from 'undici'; @@ -54,17 +56,29 @@ export default async function createCustomProxyAgent( : undefined; try { + const proxyUrl = + (proxySettings.useSsl ? 'https://' : 'http://') + + proxySettings.hostname + + ':' + + proxySettings.port; + const proxyAgent = new ProxyAgent({ - uri: - (proxySettings.useSsl ? 'https://' : 'http://') + - proxySettings.hostname + - ':' + - proxySettings.port, + uri: proxyUrl, token, keepAliveTimeout: 5000, }); setGlobalDispatcher(proxyAgent.compose(noProxyInterceptor)); + + axios.defaults.httpAgent = new HttpProxyAgent(proxyUrl); + axios.defaults.httpsAgent = new HttpsProxyAgent(proxyUrl); + axios.interceptors.request.use((config) => { + if (config.url && skipUrl(config.url)) { + config.httpAgent = false; + config.httpsAgent = false; + } + return config; + }); } catch (e) { logger.error('Failed to connect to the proxy: ' + e.message, { label: 'Proxy',