Compare commits

...

1 Commits

Author SHA1 Message Date
gauthier-th
f797e06e18 fix(proxy): modify the registration of the axios interceptors
The previous way of adding Axios interceptors added a new interceptor each time, causing lags after
a while because of all the duplicate interceptors added.

fix #1787
2025-07-20 00:14:56 +02:00
4 changed files with 15 additions and 9 deletions

View File

@@ -1,3 +1,4 @@
import { requestInterceptorFunction } from '@server/utils/customProxyAgent';
import type { AxiosInstance, AxiosRequestConfig } from 'axios'; import type { AxiosInstance, AxiosRequestConfig } from 'axios';
import axios from 'axios'; import axios from 'axios';
import rateLimit from 'axios-rate-limit'; import rateLimit from 'axios-rate-limit';
@@ -37,8 +38,7 @@ class ExternalAPI {
...options.headers, ...options.headers,
}, },
}); });
this.axios.interceptors.request = axios.interceptors.request; this.axios.interceptors.request.use(requestInterceptorFunction);
this.axios.interceptors.response = axios.interceptors.response;
if (options.rateLimit) { if (options.rateLimit) {
this.axios = rateLimit(this.axios, { this.axios = rateLimit(this.axios, {

View File

@@ -1,6 +1,7 @@
import type { User } from '@server/entity/User'; import type { User } from '@server/entity/User';
import type { TautulliSettings } from '@server/lib/settings'; import type { TautulliSettings } from '@server/lib/settings';
import logger from '@server/logger'; import logger from '@server/logger';
import { requestInterceptorFunction } from '@server/utils/customProxyAgent';
import type { AxiosInstance } from 'axios'; import type { AxiosInstance } from 'axios';
import axios from 'axios'; import axios from 'axios';
import { uniqWith } from 'lodash'; import { uniqWith } from 'lodash';
@@ -123,8 +124,7 @@ class TautulliAPI {
}${settings.urlBase ?? ''}`, }${settings.urlBase ?? ''}`,
params: { apikey: settings.apiKey }, params: { apikey: settings.apiKey },
}); });
this.axios.interceptors.request = axios.interceptors.request; this.axios.interceptors.request.use(requestInterceptorFunction);
this.axios.interceptors.response = axios.interceptors.response;
} }
public async getInfo(): Promise<TautulliInfo> { public async getInfo(): Promise<TautulliInfo> {

View File

@@ -1,4 +1,5 @@
import logger from '@server/logger'; import logger from '@server/logger';
import { requestInterceptorFunction } from '@server/utils/customProxyAgent';
import axios from 'axios'; import axios from 'axios';
import rateLimit, { type rateLimitOptions } from 'axios-rate-limit'; import rateLimit, { type rateLimitOptions } from 'axios-rate-limit';
import { createHash } from 'crypto'; import { createHash } from 'crypto';
@@ -150,8 +151,7 @@ class ImageProxy {
baseURL: baseUrl, baseURL: baseUrl,
headers: options.headers, headers: options.headers,
}); });
this.axios.interceptors.request = axios.interceptors.request; this.axios.interceptors.request.use(requestInterceptorFunction);
this.axios.interceptors.response = axios.interceptors.response;
if (options.rateLimitOptions) { if (options.rateLimitOptions) {
this.axios = rateLimit(this.axios, options.rateLimitOptions); this.axios = rateLimit(this.axios, options.rateLimitOptions);

View File

@@ -1,11 +1,15 @@
import type { ProxySettings } from '@server/lib/settings'; import type { ProxySettings } from '@server/lib/settings';
import logger from '@server/logger'; import logger from '@server/logger';
import axios from 'axios'; import axios, { type InternalAxiosRequestConfig } from 'axios';
import { HttpProxyAgent } from 'http-proxy-agent'; import { HttpProxyAgent } from 'http-proxy-agent';
import { HttpsProxyAgent } from 'https-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent';
import type { Dispatcher } from 'undici'; import type { Dispatcher } from 'undici';
import { Agent, ProxyAgent, setGlobalDispatcher } from 'undici'; import { Agent, ProxyAgent, setGlobalDispatcher } from 'undici';
export let requestInterceptorFunction: (
config: InternalAxiosRequestConfig
) => InternalAxiosRequestConfig;
export default async function createCustomProxyAgent( export default async function createCustomProxyAgent(
proxySettings: ProxySettings proxySettings: ProxySettings
) { ) {
@@ -73,7 +77,8 @@ export default async function createCustomProxyAgent(
axios.defaults.httpsAgent = new HttpsProxyAgent(proxyUrl, { axios.defaults.httpsAgent = new HttpsProxyAgent(proxyUrl, {
headers: token ? { 'proxy-authorization': token } : undefined, headers: token ? { 'proxy-authorization': token } : undefined,
}); });
axios.interceptors.request.use((config) => {
requestInterceptorFunction = (config) => {
const url = config.baseURL const url = config.baseURL
? new URL(config.baseURL + (config.url || '')) ? new URL(config.baseURL + (config.url || ''))
: config.url; : config.url;
@@ -82,7 +87,8 @@ export default async function createCustomProxyAgent(
config.httpsAgent = false; config.httpsAgent = false;
} }
return config; return config;
}); };
axios.interceptors.request.use(requestInterceptorFunction);
} catch (e) { } catch (e) {
logger.error('Failed to connect to the proxy: ' + e.message, { logger.error('Failed to connect to the proxy: ' + e.message, {
label: 'Proxy', label: 'Proxy',