chore(deps): upgrade axios [EE-6488] (#10885)

Co-authored-by: Matt Hook <hookenz@gmail.com>
pull/10528/head
Chaim Lev-Ari 2024-01-02 13:26:54 +07:00 committed by GitHub
parent 4c226d7a17
commit a1519ba737
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 116 additions and 57 deletions

View File

@ -1,4 +1,4 @@
import axiosOrigin, { AxiosError, AxiosRequestConfig } from 'axios';
import axiosOrigin, { AxiosError, InternalAxiosRequestConfig } from 'axios';
import { setupCache } from 'axios-cache-adapter';
import { loadProgressBar } from 'axios-progress-bar';
@ -18,14 +18,18 @@ export const cache = setupCache({
exclude: {
query: false, // include urls with query params
methods: ['put', 'patch', 'delete'],
filter: (req: AxiosRequestConfig) => {
filter: (req: InternalAxiosRequestConfig) => {
// exclude caching get requests unless the path contains 'kubernetes'
if (!req.url?.includes('kubernetes') && req.method === 'get') {
return true;
}
// exclude caching get with yaml accept header
if (req.headers?.Accept.includes('application/yaml')) {
const acceptHeader = req.headers?.Accept;
if (
acceptHeader &&
typeof acceptHeader === 'string' &&
acceptHeader.includes('application/yaml')
) {
return true;
}
@ -59,12 +63,12 @@ export default axios;
export const agentTargetHeader = 'X-PortainerAgent-Target';
export function agentInterceptor(config: AxiosRequestConfig) {
export function agentInterceptor(config: InternalAxiosRequestConfig) {
if (!config.url || !config.url.includes('/docker/')) {
return config;
}
const newConfig = { headers: config.headers || {}, ...config };
const newConfig = { ...config };
const target = portainerAgentTargetHeader();
if (target) {
newConfig.headers[agentTargetHeader] = target;
@ -135,16 +139,40 @@ export function parseAxiosError(
return new PortainerError(resultMsg, resultErr);
}
export function defaultErrorParser(axiosError: AxiosError) {
const message = axiosError.response?.data.message || '';
const details = axiosError.response?.data.details || message;
const error = new Error(message);
type DefaultAxiosErrorType = {
message: string;
details?: string;
};
export function defaultErrorParser(axiosError: AxiosError<unknown>) {
if (isDefaultResponse(axiosError.response?.data)) {
const message = axiosError.response?.data.message || '';
const details = axiosError.response?.data.details || message;
const error = new Error(message);
return { error, details };
}
const details = axiosError.response?.data
? axiosError.response?.data.toString()
: '';
const error = new Error('Axios error');
return { error, details };
}
export function isAxiosError<
ResponseType = { message: string; details: string },
>(error: unknown): error is AxiosError<ResponseType> {
export function isDefaultResponse(
data: unknown
): data is DefaultAxiosErrorType {
return (
!!data &&
typeof data === 'object' &&
'message' in data &&
typeof data.message === 'string'
);
}
export function isAxiosError<ResponseType>(
error: unknown
): error is AxiosError<ResponseType> {
return axiosOrigin.isAxiosError(error);
}

View File

@ -1,4 +1,4 @@
import { AxiosRequestConfig, AxiosResponse } from 'axios';
import { InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { IHttpResponse } from 'angular';
import axios from './axios';
@ -26,12 +26,12 @@ export function csrfTokenReaderInterceptorAngular(
return config;
}
export function csrfInterceptor(config: AxiosRequestConfig) {
export function csrfInterceptor(config: InternalAxiosRequestConfig) {
if (!csrfToken) {
return config;
}
const newConfig = { headers: config.headers || {}, ...config };
const newConfig = { ...config };
newConfig.headers['X-CSRF-Token'] = csrfToken;
return newConfig;
}

View File

@ -29,7 +29,7 @@ async function getSubscriptions(environmentId: EnvironmentId) {
return data.value;
} catch (e) {
throw parseAxiosError(
e as Error,
e,
'Unable to retrieve subscriptions',
azureErrorParser
);

View File

@ -1,9 +1,22 @@
import { AxiosError } from 'axios';
export function azureErrorParser(axiosError: AxiosError) {
if (!axiosError.response) {
const error = new Error('Failed azure request');
return {
error,
details: axiosError.message,
};
}
const responseData = axiosError.response.data;
const message =
(axiosError.response?.data?.error?.message as string) ||
'Failed azure request';
responseData &&
typeof responseData === 'object' &&
'error' in responseData &&
typeof responseData.error === 'string'
? responseData.error
: `Failed azure request: ${axiosError.response?.statusText}`;
return {
error: new Error(message),

View File

@ -1,5 +1,5 @@
import { useMutation, useQueryClient } from 'react-query';
import { AxiosRequestHeaders } from 'axios';
import { RawAxiosRequestHeaders } from 'axios';
import axios, { parseAxiosError } from '@/portainer/services/axios';
import {
@ -282,7 +282,7 @@ async function createContainer(
{ nodeName }: { nodeName?: string } = {}
) {
try {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;

View File

@ -1,4 +1,4 @@
import { AxiosRequestHeaders } from 'axios';
import { RawAxiosRequestHeaders } from 'axios';
import { EnvironmentId } from '@/react/portainer/environments/types';
import PortainerError from '@/portainer/error';
@ -12,7 +12,7 @@ export async function startContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -34,7 +34,7 @@ export async function stopContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -49,7 +49,7 @@ export async function recreateContainer(
pullImage: boolean,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -69,7 +69,7 @@ export async function restartContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -87,7 +87,7 @@ export async function killContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -101,7 +101,7 @@ export async function pauseContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -115,7 +115,7 @@ export async function resumeContainer(
id: ContainerId,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -134,7 +134,7 @@ export async function renameContainer(
name: string,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;
@ -156,7 +156,7 @@ export async function removeContainer(
}: { removeVolumes?: boolean; nodeName?: string } = {}
) {
try {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;

View File

@ -1,5 +1,5 @@
import { Resources, RestartPolicy } from 'docker-types/generated/1.41';
import { AxiosRequestHeaders } from 'axios';
import { RawAxiosRequestHeaders } from 'axios';
import axios, { parseAxiosError } from '@/portainer/services/axios';
import { EnvironmentId } from '@/react/portainer/environments/types';
@ -22,7 +22,7 @@ export async function updateContainer(
config: UpdateConfig,
{ nodeName }: { nodeName?: string } = {}
) {
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;

View File

@ -1,4 +1,4 @@
import { AxiosRequestHeaders } from 'axios';
import { RawAxiosRequestHeaders } from 'axios';
import axios, { parseAxiosError } from '@/portainer/services/axios';
import { EnvironmentId } from '@/react/portainer/environments/types';
@ -31,7 +31,7 @@ export async function pullImage({
const imageURI = buildImageFullURI(image, registry);
const headers: AxiosRequestHeaders = {
const headers: RawAxiosRequestHeaders = {
'X-Registry-Auth': authenticationDetails,
};

View File

@ -1,5 +1,5 @@
import { EndpointSettings } from 'docker-types/generated/1.41';
import { AxiosRequestHeaders } from 'axios';
import { RawAxiosRequestHeaders } from 'axios';
import { useMutation, useQueryClient } from 'react-query';
import axios, { parseAxiosError } from '@/portainer/services/axios';
@ -56,7 +56,7 @@ export async function connectContainer({
};
}
const headers: AxiosRequestHeaders = {};
const headers: RawAxiosRequestHeaders = {};
if (nodeName) {
headers['X-PortainerAgent-Target'] = nodeName;

View File

@ -1,7 +1,10 @@
import { AxiosError } from 'axios';
import { useQuery } from 'react-query';
import axios, { parseAxiosError } from '@/portainer/services/axios';
import axios, {
isDefaultResponse,
parseAxiosError,
} from '@/portainer/services/axios';
interface Creds {
username?: string;
@ -45,8 +48,10 @@ export async function checkRepo(
);
return true;
} catch (error) {
throw parseAxiosError(error as Error, '', (axiosError: AxiosError) => {
let details = axiosError.response?.data.details;
throw parseAxiosError(error, '', (axiosError: AxiosError) => {
let details = isDefaultResponse(axiosError.response?.data)
? axiosError.response?.data.details || ''
: '';
const { creds = {} } = options;
// If no credentials were provided alter error from git to indicate repository is not found or is private

View File

@ -37,7 +37,7 @@ describe('getLicenses', () => {
const promise = getLicenses();
await promise.then(thenFn, catchFn);
expect(catchFn).toHaveBeenCalledWith(new Error(message));
expect(catchFn).toHaveBeenCalledWith(new Error(details));
expect(thenFn).not.toHaveBeenCalled();
});
});

View File

@ -1,7 +1,7 @@
import _ from 'lodash';
import { AxiosError } from 'axios';
import axios from '@/portainer/services/axios';
import axios, { parseAxiosError } from '@/portainer/services/axios';
import { License, LicenseInfo } from './types';
@ -25,8 +25,7 @@ export async function getLicenses() {
return data;
} catch (e) {
const axiosError = e as AxiosError;
throw new Error(axiosError.response?.data.message);
throw parseAxiosError(e);
}
}
@ -55,7 +54,7 @@ export async function attachLicense(licenseKeys: string[]) {
'Your session has expired, please refresh the browser and log in again.'
);
}
throw new Error(axiosError.response?.data.message);
throw parseAxiosError(e);
}
}
@ -76,8 +75,7 @@ export async function removeLicense(licenseKeys: string[]) {
getLicenseInfo();
return data;
} catch (e) {
const axiosError = e as AxiosError;
throw new Error(axiosError.response?.data.message);
throw parseAxiosError(e);
}
}
@ -105,8 +103,7 @@ export async function getLicenseInfo() {
return info;
} catch (e) {
const axiosError = e as AxiosError;
throw new Error(axiosError.response?.data.message);
throw parseAxiosError(e);
}
}

View File

@ -73,7 +73,7 @@
"angularjs-scroll-glue": "^2.2.0",
"angularjs-slider": "^6.4.0",
"angulartics": "^1.6.0",
"axios": "^0.24.0",
"axios": "^1.6.2",
"axios-cache-adapter": "^2.7.3",
"axios-progress-bar": "^1.2.0",
"babel-plugin-angularjs-annotate": "^0.10.0",

View File

@ -6483,12 +6483,14 @@ axios-progress-bar@^1.2.0:
resolved "https://registry.yarnpkg.com/axios-progress-bar/-/axios-progress-bar-1.2.0.tgz#f9ee88dc9af977246be1ef07eedfa4c990c639c5"
integrity sha512-PEgWb/b2SMyHnKJ/cxA46OdCuNeVlo8eqL0HxXPtz+6G/Jtpyo49icPbW+jpO1wUeDEjbqpseMoCyWxESxf5pA==
axios@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
axios@^1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2"
integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==
dependencies:
follow-redirects "^1.14.4"
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axobject-query@^3.1.1:
version "3.1.1"
@ -9698,11 +9700,16 @@ focus-lock@^0.11.2:
dependencies:
tslib "^2.0.3"
follow-redirects@^1.0.0, follow-redirects@^1.14.4:
follow-redirects@^1.0.0:
version "1.15.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
follow-redirects@^1.15.0:
version "1.15.3"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a"
integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
@ -9757,6 +9764,15 @@ form-data@^3.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
formik@^2.2.9:
version "2.2.9"
resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0"
@ -14021,7 +14037,7 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
proxy-from-env@^1.0.0:
proxy-from-env@^1.0.0, proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==