diff --git a/NodeApp/src/managers/HttpManager.ts b/NodeApp/src/managers/HttpManager.ts index 5b8ea67c2a7d802a599ecb304bc04056737219dc..e90f666c4967739d857af9a604a39ca0e82fad34 100644 --- a/NodeApp/src/managers/HttpManager.ts +++ b/NodeApp/src/managers/HttpManager.ts @@ -1,7 +1,6 @@ import axios, { AxiosRequestHeaders } from 'axios'; import SessionManager from './SessionManager'; import FormData from 'form-data'; -import GitlabManager from './GitlabManager'; import { StatusCodes } from 'http-status-codes'; import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; import { version } from '../config/Version'; @@ -35,15 +34,15 @@ class HttpManager { } if ( SessionManager.isLogged ) { - config.headers.Authorization = `Bearer ${ SessionManager.token }`; + config.headers.Authorization = `Bearer ${ SessionManager.apiToken }`; } config.headers['client'] = 'DojoCLI'; config.headers['client-version'] = version; } - if ( GitlabManager.isLogged && config.url && config.url.indexOf(SharedConfig.gitlab.apiURL) !== -1 ) { - config.headers['PRIVATE-TOKEN'] = GitlabManager.token; + if ( SessionManager.gitlabCredentials.accessToken && config.url && config.url.indexOf(SharedConfig.gitlab.apiURL) !== -1 ) { + config.headers.Authorization = `Bearer ${ SessionManager.gitlabCredentials.accessToken }`; } return config; @@ -66,13 +65,35 @@ class HttpManager { private registerResponseInterceptor() { axios.interceptors.response.use((response) => { if ( response.data && response.data.sessionToken ) { - SessionManager.token = response.data.sessionToken; + SessionManager.apiToken = response.data.sessionToken; } return response; - }, (error) => { + }, async (error) => { if ( error.response ) { - if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && error.response.data ) { + const originalConfig = error.config; + + const isFromApi = error.response.config.url && error.response.config.url.indexOf(ClientsSharedConfig.apiURL) !== -1; + const isFromGitlab = error.response.config.url && error.response.config.url.indexOf(SharedConfig.gitlab.URL) !== -1; + + // Try to refresh the Gitlab tokens if the request have failed with a 401 error + if ( error.response.status === StatusCodes.UNAUTHORIZED && isFromGitlab && !originalConfig._retry ) { + originalConfig._retry = true; + + try { + await SessionManager.refreshTokens(); + + return axios(originalConfig); + } catch ( _error: any ) { + if ( _error.response && _error.response.data ) { + return Promise.reject(_error.response.data); + } + + return Promise.reject(_error); + } + } + + if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && isFromApi && error.response.data ) { const data: DojoBackendResponse<{}> = error.response.data; switch ( data.code ) { @@ -88,7 +109,7 @@ class HttpManager { } if ( this.handleAuthorizationCommandErrors ) { - if ( error.response.url && error.response.url.indexOf(ClientsSharedConfig.apiURL) !== -1 ) { + if ( isFromApi ) { switch ( error.response.status ) { case StatusCodes.UNAUTHORIZED: this.requestError('Session expired or does not exist. Please login again.');