mirror of https://github.com/portainer/portainer
				
				
				
			chore(deps): upgrade axios [EE-6488] (#10885)
Co-authored-by: Matt Hook <hookenz@gmail.com>pull/10528/head
							parent
							
								
									4c226d7a17
								
							
						
					
					
						commit
						a1519ba737
					
				|  | @ -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) { | ||||
| 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 }; | ||||
|   } | ||||
| 
 | ||||
| export function isAxiosError< | ||||
|   ResponseType = { message: string; details: string }, | ||||
| >(error: unknown): error is AxiosError<ResponseType> { | ||||
|   const details = axiosError.response?.data | ||||
|     ? axiosError.response?.data.toString() | ||||
|     : ''; | ||||
|   const error = new Error('Axios error'); | ||||
|   return { error, details }; | ||||
| } | ||||
| 
 | ||||
| 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); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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 | ||||
|     ); | ||||
|  |  | |||
|  | @ -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), | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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, | ||||
|   }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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(); | ||||
|   }); | ||||
| }); | ||||
|  |  | |||
|  | @ -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); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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", | ||||
|  |  | |||
							
								
								
									
										30
									
								
								yarn.lock
								
								
								
								
							
							
						
						
									
										30
									
								
								yarn.lock
								
								
								
								
							|  | @ -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== | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Chaim Lev-Ari
						Chaim Lev-Ari