11const debug = require ( 'debug' ) ( 'codefresh:http' ) ;
22const fs = require ( 'fs' ) ;
33const path = require ( 'path' ) ;
4- const rp = require ( 'request-promise ' ) ;
4+ const request = require ( 'requestretry ' ) ;
55const _ = require ( 'lodash' ) ;
66const CFError = require ( 'cf-errors' ) ;
7- const { printError } = require ( '../../interface/cli/helpers/general' ) ;
7+ const { printError, isDebug } = require ( '../../interface/cli/helpers/general' ) ;
8+ const config = require ( '../../logic/cli-config/Manager' ) . config ( ) ;
89
910const { version } = JSON . parse ( fs . readFileSync ( path . resolve ( __dirname , '../../../package.json' ) ) ) ;
1011
12+ const RETRY_STATUS_CODES = [ 502 , 503 , 504 ] ;
13+ const retryOptions = {
14+ fullResponse : true ,
15+ maxAttempts : config . request . maxRetries ,
16+ retryDelay : config . request . retryDelay ,
17+ retryStrategy : ( err , response ) => ! isDebug ( ) && ( request . RetryStrategies . NetworkError ( err ) || RETRY_STATUS_CODES . includes ( response . statusCode ) ) ,
18+ } ;
19+
20+ function _makeResponseError ( response ) {
21+ return new Error ( JSON . stringify ( response . body || response ) ) ;
22+ }
23+
1124const sendHttpRequest = async ( httpOptions , authContext , throwOnUnauthorized , timeout = 30000 ) => {
1225 let finalAuthContext ;
1326 if ( ! authContext ) {
@@ -20,6 +33,7 @@ const sendHttpRequest = async (httpOptions, authContext, throwOnUnauthorized, ti
2033 const finalOptions = _ . merge (
2134 httpOptions ,
2235 finalAuthContext . prepareHttpOptions ( ) ,
36+ retryOptions ,
2337 {
2438 json : true ,
2539 timeout,
@@ -30,45 +44,55 @@ const sendHttpRequest = async (httpOptions, authContext, throwOnUnauthorized, ti
3044 } ,
3145 ) ;
3246 debug ( 'Sending http request:\n%O' , finalOptions ) ;
33- let response ;
34- try {
35- response = await rp ( finalOptions ) ;
36- } catch ( err ) {
37- debug ( 'Response:\n%O' , err . response . body ) ;
3847
39- if ( _ . isEqual ( err . statusCode , 401 ) ) {
40- const error = new CFError ( {
41- cause : err ,
42- message : 'Error: Please create or update your authentication context' ,
43- } ) ;
48+ // only network errors will be thrown -- no need to catch
49+ const response = await request ( finalOptions ) ;
4450
45- if ( ! throwOnUnauthorized ) {
46- printError ( error ) ;
47- process . exit ( 1 ) ;
48- } else {
49- throw error ;
50- }
51- }
52- if ( _ . isEqual ( err . statusCode , 403 ) ) {
53- printError ( new CFError ( {
54- cause : err ,
55- message : 'Error: You do not have permissions to perform this action' ,
56- } ) ) ;
51+ debug ( 'Response:\n%O' , response . body ) ;
52+
53+ const { statusCode } = response ;
54+
55+ // if for some reason request was not properly redirected (when "Location" header is lost, not usual case)
56+ if ( statusCode >= 300 && statusCode < 400 ) {
57+ throw new CFError ( {
58+ cause : _makeResponseError ( response ) ,
59+ message : 'Error: Request was not properly redirected' ,
60+ } ) ;
61+ }
62+ if ( statusCode === 401 ) {
63+ const error = new CFError ( {
64+ cause : _makeResponseError ( response ) ,
65+ message : 'Error: Please create or update your authentication context' ,
66+ } ) ;
67+
68+ if ( ! throwOnUnauthorized ) {
69+ printError ( error ) ;
5770 process . exit ( 1 ) ;
71+ } else {
72+ throw error ;
5873 }
74+ }
75+ if ( statusCode === 403 ) {
76+ printError ( new CFError ( {
77+ cause : _makeResponseError ( response ) ,
78+ message : 'Error: You do not have permissions to perform this action' ,
79+ } ) ) ;
80+ process . exit ( 1 ) ;
81+ }
5982
60- if ( _ . get ( err , 'error.message' ) ) {
61- if ( _ . get ( err , 'error.error' ) ) {
62- throw new Error ( `message: ${ err . error . message } \nerror: ${ err . error . error } ` ) ;
83+ // other status codes
84+ if ( statusCode >= 400 && statusCode < 600 ) {
85+ if ( _ . get ( response , 'body.message' ) ) {
86+ if ( _ . get ( response , 'body.error' ) ) {
87+ throw new Error ( `message: ${ response . body . message } \nerror: ${ response . body . error } ` ) ;
6388 } else {
64- throw new Error ( err . error . message ) ;
89+ throw new Error ( response . body . message ) ;
6590 }
6691 } else {
67- throw err ;
92+ throw _makeResponseError ( response ) ;
6893 }
6994 }
70- debug ( 'Response:\n%O' , response ) ;
71- return response ;
95+ return response . body ;
7296} ;
7397
7498module . exports = {
0 commit comments