Skip to content
Snippets Groups Projects
Commit c8442524 authored by michael.minelli's avatar michael.minelli
Browse files

HttpManager => Detect gitlab token expiration and call refreshTokens

parent d1804273
No related branches found
No related tags found
No related merge requests found
Pipeline #26749 failed
import axios, { AxiosRequestHeaders } from 'axios'; import axios, { AxiosRequestHeaders } from 'axios';
import SessionManager from './SessionManager'; import SessionManager from './SessionManager';
import FormData from 'form-data'; import FormData from 'form-data';
import GitlabManager from './GitlabManager';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';
import { version } from '../config/Version'; import { version } from '../config/Version';
...@@ -35,15 +34,15 @@ class HttpManager { ...@@ -35,15 +34,15 @@ class HttpManager {
} }
if ( SessionManager.isLogged ) { if ( SessionManager.isLogged ) {
config.headers.Authorization = `Bearer ${ SessionManager.token }`; config.headers.Authorization = `Bearer ${ SessionManager.apiToken }`;
} }
config.headers['client'] = 'DojoCLI'; config.headers['client'] = 'DojoCLI';
config.headers['client-version'] = version; config.headers['client-version'] = version;
} }
if ( GitlabManager.isLogged && config.url && config.url.indexOf(SharedConfig.gitlab.apiURL) !== -1 ) { if ( SessionManager.gitlabCredentials.accessToken && config.url && config.url.indexOf(SharedConfig.gitlab.apiURL) !== -1 ) {
config.headers['PRIVATE-TOKEN'] = GitlabManager.token; config.headers.Authorization = `Bearer ${ SessionManager.gitlabCredentials.accessToken }`;
} }
return config; return config;
...@@ -66,13 +65,35 @@ class HttpManager { ...@@ -66,13 +65,35 @@ class HttpManager {
private registerResponseInterceptor() { private registerResponseInterceptor() {
axios.interceptors.response.use((response) => { axios.interceptors.response.use((response) => {
if ( response.data && response.data.sessionToken ) { if ( response.data && response.data.sessionToken ) {
SessionManager.token = response.data.sessionToken; SessionManager.apiToken = response.data.sessionToken;
} }
return response; return response;
}, (error) => { }, async (error) => {
if ( error.response ) { 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; const data: DojoBackendResponse<{}> = error.response.data;
switch ( data.code ) { switch ( data.code ) {
...@@ -88,7 +109,7 @@ class HttpManager { ...@@ -88,7 +109,7 @@ class HttpManager {
} }
if ( this.handleAuthorizationCommandErrors ) { if ( this.handleAuthorizationCommandErrors ) {
if ( error.response.url && error.response.url.indexOf(ClientsSharedConfig.apiURL) !== -1 ) { if ( isFromApi ) {
switch ( error.response.status ) { switch ( error.response.status ) {
case StatusCodes.UNAUTHORIZED: case StatusCodes.UNAUTHORIZED:
this.requestError('Session expired or does not exist. Please login again.'); this.requestError('Session expired or does not exist. Please login again.');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment