@ -1252,9 +1252,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
} ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
const core = _ _importStar ( _ _webpack _require _ _ ( 470 ) ) ;
const fs = _ _importStar ( _ _webpack _require _ _ ( 747 ) ) ;
const auth _1 = _ _webpack _require _ _ ( 226 ) ;
const http _client _1 = _ _webpack _require _ _ ( 539 ) ;
const auth _1 = _ _webpack _require _ _ ( 226 ) ;
const fs = _ _importStar ( _ _webpack _require _ _ ( 747 ) ) ;
const stream = _ _importStar ( _ _webpack _require _ _ ( 794 ) ) ;
const util = _ _importStar ( _ _webpack _require _ _ ( 669 ) ) ;
const constants _1 = _ _webpack _require _ _ ( 694 ) ;
@ -1265,6 +1265,12 @@ function isSuccessStatusCode(statusCode) {
}
return statusCode >= 200 && statusCode < 300 ;
}
function isServerErrorStatusCode ( statusCode ) {
if ( ! statusCode ) {
return true ;
}
return statusCode >= 500 ;
}
function isRetryableStatusCode ( statusCode ) {
if ( ! statusCode ) {
return false ;
@ -1304,12 +1310,56 @@ function createHttpClient() {
const bearerCredentialHandler = new auth _1 . BearerCredentialHandler ( token ) ;
return new http _client _1 . HttpClient ( "actions/cache" , [ bearerCredentialHandler ] , getRequestOptions ( ) ) ;
}
function retry ( name , method , getStatusCode , maxAttempts = 2 ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
let response = undefined ;
let statusCode = undefined ;
let isRetryable = false ;
let errorMessage = "" ;
let attempt = 1 ;
while ( attempt <= maxAttempts ) {
try {
response = yield method ( ) ;
statusCode = getStatusCode ( response ) ;
if ( ! isServerErrorStatusCode ( statusCode ) ) {
return response ;
}
isRetryable = isRetryableStatusCode ( statusCode ) ;
errorMessage = ` Cache service responded with ${ statusCode } ` ;
}
catch ( error ) {
isRetryable = true ;
errorMessage = error . message ;
}
core . debug ( ` ${ name } - Attempt ${ attempt } of ${ maxAttempts } failed with error: ${ errorMessage } ` ) ;
if ( ! isRetryable ) {
core . debug ( ` ${ name } - Error is not retryable ` ) ;
break ;
}
attempt ++ ;
}
throw Error ( ` ${ name } failed: ${ errorMessage } ` ) ;
} ) ;
}
exports . retry = retry ;
function retryTypedResponse ( name , method , maxAttempts = 2 ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
return yield retry ( name , method , ( response ) => response . statusCode , maxAttempts ) ;
} ) ;
}
exports . retryTypedResponse = retryTypedResponse ;
function retryHttpClientResponse ( name , method , maxAttempts = 2 ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
return yield retry ( name , method , ( response ) => response . message . statusCode , maxAttempts ) ;
} ) ;
}
exports . retryHttpClientResponse = retryHttpClientResponse ;
function getCacheEntry ( keys ) {
var _a ;
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
const httpClient = createHttpClient ( ) ;
const resource = ` cache?keys= ${ encodeURIComponent ( keys . join ( "," ) ) } ` ;
const response = yield httpClient . getJson ( getCacheApiUrl ( resource ) ) ;
const response = yield retryTypedResponse( "getCacheEntry" , ( ) => httpClient. getJson ( getCacheApiUrl ( resource ) ) ) ;
if ( response . statusCode === 204 ) {
return null ;
}
@ -1338,7 +1388,7 @@ function downloadCache(archiveLocation, archivePath) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
const stream = fs . createWriteStream ( archivePath ) ;
const httpClient = new http _client _1 . HttpClient ( "actions/cache" ) ;
const downloadResponse = yield httpClient. get ( archiveLocation ) ;
const downloadResponse = yield retryHttpClientResponse( "downloadCache" , ( ) => httpClient. get ( archiveLocation ) ) ;
// Abort download if no traffic received over the socket.
downloadResponse . message . socket . setTimeout ( constants _1 . SocketTimeout , ( ) => {
downloadResponse . message . destroy ( ) ;
@ -1368,7 +1418,7 @@ function reserveCache(key) {
const reserveCacheRequest = {
key
} ;
const response = yield httpClient. postJson ( getCacheApiUrl ( "caches" ) , reserveCacheRequest ) ;
const response = yield retryTypedResponse( "reserveCache" , ( ) => httpClient. postJson ( getCacheApiUrl ( "caches" ) , reserveCacheRequest ) ) ;
return _c = ( _b = ( _a = response ) === null || _a === void 0 ? void 0 : _a . result ) === null || _b === void 0 ? void 0 : _b . cacheId , ( _c !== null && _c !== void 0 ? _c : - 1 ) ;
} ) ;
}
@ -1390,21 +1440,7 @@ function uploadChunk(httpClient, resourceUrl, openStream, start, end) {
"Content-Type" : "application/octet-stream" ,
"Content-Range" : getContentRange ( start , end )
} ;
const uploadChunkRequest = ( ) => _ _awaiter ( this , void 0 , void 0 , function * ( ) {
return yield httpClient . sendStream ( "PATCH" , resourceUrl , openStream ( ) , additionalHeaders ) ;
} ) ;
const response = yield uploadChunkRequest ( ) ;
if ( isSuccessStatusCode ( response . message . statusCode ) ) {
return ;
}
if ( isRetryableStatusCode ( response . message . statusCode ) ) {
core . debug ( ` Received ${ response . message . statusCode } , retrying chunk at offset ${ start } . ` ) ;
const retryResponse = yield uploadChunkRequest ( ) ;
if ( isSuccessStatusCode ( retryResponse . message . statusCode ) ) {
return ;
}
}
throw new Error ( ` Cache service responded with ${ response . message . statusCode } during chunk upload. ` ) ;
yield retryHttpClientResponse ( ` uploadChunk (start: ${ start } , end: ${ end } ) ` , ( ) => httpClient . sendStream ( "PATCH" , resourceUrl , openStream ( ) , additionalHeaders ) ) ;
} ) ;
}
function parseEnvNumber ( key ) {
@ -1456,7 +1492,7 @@ function uploadFile(httpClient, cacheId, archivePath) {
function commitCache ( httpClient , cacheId , filesize ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
const commitCacheRequest = { size : filesize } ;
return yield httpClient. postJson ( getCacheApiUrl ( ` caches/ ${ cacheId . toString ( ) } ` ) , commitCacheRequest ) ;
return yield retryTypedResponse( "commitCache" , ( ) => httpClient. postJson ( getCacheApiUrl ( ` caches/ ${ cacheId . toString ( ) } ` ) , commitCacheRequest ) ) ;
} ) ;
}
function saveCache ( cacheId , archivePath ) {
@ -1498,9 +1534,7 @@ class BasicCredentialHandler {
this . password = password ;
}
prepareRequest ( options ) {
options . headers [ 'Authorization' ] =
'Basic ' +
Buffer . from ( this . username + ':' + this . password ) . toString ( 'base64' ) ;
options . headers [ 'Authorization' ] = 'Basic ' + Buffer . from ( this . username + ':' + this . password ) . toString ( 'base64' ) ;
}
// This handler cannot handle 401
canHandleAuthentication ( response ) {
@ -1536,8 +1570,7 @@ class PersonalAccessTokenCredentialHandler {
// currently implements pre-authorization
// TODO: support preAuth = false where it hooks on 401
prepareRequest ( options ) {
options . headers [ 'Authorization' ] =
'Basic ' + Buffer . from ( 'PAT:' + this . token ) . toString ( 'base64' ) ;
options . headers [ 'Authorization' ] = 'Basic ' + Buffer . from ( 'PAT:' + this . token ) . toString ( 'base64' ) ;
}
// This handler cannot handle 401
canHandleAuthentication ( response ) {
@ -2006,7 +2039,6 @@ var HttpCodes;
HttpCodes [ HttpCodes [ "RequestTimeout" ] = 408 ] = "RequestTimeout" ;
HttpCodes [ HttpCodes [ "Conflict" ] = 409 ] = "Conflict" ;
HttpCodes [ HttpCodes [ "Gone" ] = 410 ] = "Gone" ;
HttpCodes [ HttpCodes [ "TooManyRequests" ] = 429 ] = "TooManyRequests" ;
HttpCodes [ HttpCodes [ "InternalServerError" ] = 500 ] = "InternalServerError" ;
HttpCodes [ HttpCodes [ "NotImplemented" ] = 501 ] = "NotImplemented" ;
HttpCodes [ HttpCodes [ "BadGateway" ] = 502 ] = "BadGateway" ;
@ -2031,18 +2063,8 @@ function getProxyUrl(serverUrl) {
return proxyUrl ? proxyUrl . href : '' ;
}
exports . getProxyUrl = getProxyUrl ;
const HttpRedirectCodes = [
HttpCodes . MovedPermanently ,
HttpCodes . ResourceMoved ,
HttpCodes . SeeOther ,
HttpCodes . TemporaryRedirect ,
HttpCodes . PermanentRedirect
] ;
const HttpResponseRetryCodes = [
HttpCodes . BadGateway ,
HttpCodes . ServiceUnavailable ,
HttpCodes . GatewayTimeout
] ;
const HttpRedirectCodes = [ HttpCodes . MovedPermanently , HttpCodes . ResourceMoved , HttpCodes . SeeOther , HttpCodes . TemporaryRedirect , HttpCodes . PermanentRedirect ] ;
const HttpResponseRetryCodes = [ HttpCodes . BadGateway , HttpCodes . ServiceUnavailable , HttpCodes . GatewayTimeout ] ;
const RetryableHttpVerbs = [ 'OPTIONS' , 'GET' , 'DELETE' , 'HEAD' ] ;
const ExponentialBackoffCeiling = 10 ;
const ExponentialBackoffTimeSlice = 5 ;
@ -2056,12 +2078,6 @@ class HttpClientResponse {
this . message . on ( 'data' , ( chunk ) => {
output = Buffer . concat ( [ output , chunk ] ) ;
} ) ;
this . message . on ( 'aborted' , ( ) => {
reject ( "Request was aborted or closed prematurely" ) ;
} ) ;
this . message . on ( 'timeout' , ( socket ) => {
reject ( "Request timed out" ) ;
} ) ;
this . message . on ( 'end' , ( ) => {
resolve ( output . toString ( ) ) ;
} ) ;
@ -2173,23 +2189,18 @@ class HttpClient {
* /
async request ( verb , requestUrl , data , headers ) {
if ( this . _disposed ) {
throw new Error ( 'Client has already been disposed.' ) ;
throw new Error ( "Client has already been disposed." ) ;
}
let parsedUrl = url . parse ( requestUrl ) ;
let info = this . _prepareRequest ( verb , parsedUrl , headers ) ;
// Only perform retries on reads since writes may not be idempotent.
let maxTries = this . _allowRetries && RetryableHttpVerbs . indexOf ( verb ) != - 1
? this . _maxRetries + 1
: 1 ;
let maxTries = ( this . _allowRetries && RetryableHttpVerbs . indexOf ( verb ) != - 1 ) ? this . _maxRetries + 1 : 1 ;
let numTries = 0 ;
let response ;
while ( numTries < maxTries ) {
response = await this . requestRaw ( info , data ) ;
// Check if it's an authentication challenge
if ( response &&
response . message &&
response . message . statusCode === HttpCodes . Unauthorized ) {
if ( response && response . message && response . message . statusCode === HttpCodes . Unauthorized ) {
let authenticationHandler ;
for ( let i = 0 ; i < this . handlers . length ; i ++ ) {
if ( this . handlers [ i ] . canHandleAuthentication ( response ) ) {
@ -2207,32 +2218,21 @@ class HttpClient {
}
}
let redirectsRemaining = this . _maxRedirects ;
while ( HttpRedirectCodes . indexOf ( response . message . statusCode ) != - 1 &&
this . _allowRedirects &&
redirectsRemaining > 0 ) {
const redirectUrl = response . message . headers [ 'location' ] ;
while ( HttpRedirectCodes . indexOf ( response . message . statusCode ) != - 1
&& this . _allowRedirects
&& redirectsRemaining > 0 ) {
const redirectUrl = response . message . headers [ "location" ] ;
if ( ! redirectUrl ) {
// if there's no location to redirect to, we won't
break ;
}
let parsedRedirectUrl = url . parse ( redirectUrl ) ;
if ( parsedUrl . protocol == 'https:' &&
parsedUrl . protocol != parsedRedirectUrl . protocol &&
! this . _allowRedirectDowngrade ) {
throw new Error ( 'Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.' ) ;
if ( parsedUrl . protocol == 'https:' && parsedUrl . protocol != parsedRedirectUrl . protocol && ! this . _allowRedirectDowngrade ) {
throw new Error ( "Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true." ) ;
}
// we need to finish reading the response before reassigning response
// which will leak the open socket.
await response . readBody ( ) ;
// strip authorization header if redirected to a different hostname
if ( parsedRedirectUrl . hostname !== parsedUrl . hostname ) {
for ( let header in headers ) {
// header names are case insensitive
if ( header . toLowerCase ( ) === 'authorization' ) {
delete headers [ header ] ;
}
}
}
// let's make the request with the new redirectUrl
info = this . _prepareRequest ( verb , parsedRedirectUrl , headers ) ;
response = await this . requestRaw ( info , data ) ;
@ -2283,8 +2283,8 @@ class HttpClient {
* /
requestRawWithCallback ( info , data , onResult ) {
let socket ;
if ( typeof data === 'string' ) {
info . options . headers [ 'Content-Length' ] = Buffer . byteLength ( data , 'utf8' ) ;
if ( typeof ( data ) === 'string' ) {
info . options . headers [ "Content-Length" ] = Buffer . byteLength ( data , 'utf8' ) ;
}
let callbackCalled = false ;
let handleResult = ( err , res ) => {
@ -2297,7 +2297,7 @@ class HttpClient {
let res = new HttpClientResponse ( msg ) ;
handleResult ( null , res ) ;
} ) ;
req . on ( 'socket' , sock => {
req . on ( 'socket' , ( sock ) => {
socket = sock ;
} ) ;
// If we ever get disconnected, we want the socket to timeout eventually
@ -2312,10 +2312,10 @@ class HttpClient {
// res should have headers
handleResult ( err , null ) ;
} ) ;
if ( data && typeof data === 'string' ) {
if ( data && typeof ( data ) === 'string' ) {
req . write ( data , 'utf8' ) ;
}
if ( data && typeof data !== 'string' ) {
if ( data && typeof ( data ) !== 'string' ) {
data . on ( 'close' , function ( ) {
req . end ( ) ;
} ) ;
@ -2342,34 +2342,31 @@ class HttpClient {
const defaultPort = usingSsl ? 443 : 80 ;
info . options = { } ;
info . options . host = info . parsedUrl . hostname ;
info . options . port = info . parsedUrl . port
? parseInt ( info . parsedUrl . port )
: defaultPort ;
info . options . path =
( info . parsedUrl . pathname || '' ) + ( info . parsedUrl . search || '' ) ;
info . options . port = info . parsedUrl . port ? parseInt ( info . parsedUrl . port ) : defaultPort ;
info . options . path = ( info . parsedUrl . pathname || '' ) + ( info . parsedUrl . search || '' ) ;
info . options . method = method ;
info . options . headers = this . _mergeHeaders ( headers ) ;
if ( this . userAgent != null ) {
info . options . headers [ 'user-agent' ] = this . userAgent ;
info . options . headers [ "user-agent" ] = this . userAgent ;
}
info . options . agent = this . _getAgent ( info . parsedUrl ) ;
// gives handlers an opportunity to participate
if ( this . handlers ) {
this . handlers . forEach ( handler => {
this . handlers . forEach ( ( handler ) => {
handler . prepareRequest ( info . options ) ;
} ) ;
}
return info ;
}
_mergeHeaders ( headers ) {
const lowercaseKeys = obj => Object . keys ( obj ) . reduce ( ( c , k ) => ( ( c [ k . toLowerCase ( ) ] = obj [ k ] ) , c ) , { } ) ;
const lowercaseKeys = obj => Object . keys ( obj ) . reduce ( ( c , k ) => ( c [ k . toLowerCase ( ) ] = obj [ k ] , c ) , { } ) ;
if ( this . requestOptions && this . requestOptions . headers ) {
return Object . assign ( { } , lowercaseKeys ( this . requestOptions . headers ) , lowercaseKeys ( headers ) ) ;
}
return lowercaseKeys ( headers || { } ) ;
}
_getExistingOrDefaultHeader ( additionalHeaders , header , _default ) {
const lowercaseKeys = obj => Object . keys ( obj ) . reduce ( ( c , k ) => ( ( c [ k . toLowerCase ( ) ] = obj [ k ] ) , c ) , { } ) ;
const lowercaseKeys = obj => Object . keys ( obj ) . reduce ( ( c , k ) => ( c [ k . toLowerCase ( ) ] = obj [ k ] , c ) , { } ) ;
let clientHeader ;
if ( this . requestOptions && this . requestOptions . headers ) {
clientHeader = lowercaseKeys ( this . requestOptions . headers ) [ header ] ;
@ -2407,7 +2404,7 @@ class HttpClient {
proxyAuth : proxyUrl . auth ,
host : proxyUrl . hostname ,
port : proxyUrl . port
}
} ,
} ;
let tunnelAgent ;
const overHttps = proxyUrl . protocol === 'https:' ;
@ -2434,9 +2431,7 @@ class HttpClient {
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
// we have to cast it to any and change it directly
agent . options = Object . assign ( agent . options || { } , {
rejectUnauthorized : false
} ) ;
agent . options = Object . assign ( agent . options || { } , { rejectUnauthorized : false } ) ;
}
return agent ;
}
@ -2497,7 +2492,7 @@ class HttpClient {
msg = contents ;
}
else {
msg = 'Failed request: (' + statusCode + ')' ;
msg = "Failed request: (" + statusCode + ")" ;
}
let err = new Error ( msg ) ;
// attach statusCode and body obj (if available) to the error object
@ -2985,7 +2980,25 @@ const core = __importStar(__webpack_require__(470));
const exec _1 = _ _webpack _require _ _ ( 986 ) ;
const io = _ _importStar ( _ _webpack _require _ _ ( 1 ) ) ;
const fs _1 = _ _webpack _require _ _ ( 747 ) ;
function getTarPath ( ) {
const path = _ _importStar ( _ _webpack _require _ _ ( 622 ) ) ;
function isGnuTar ( ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
core . debug ( "Checking tar --version" ) ;
let versionOutput = "" ;
yield exec _1 . exec ( "tar --version" , [ ] , {
ignoreReturnCode : true ,
silent : true ,
listeners : {
stdout : ( data ) => ( versionOutput += data . toString ( ) ) ,
stderr : ( data ) => ( versionOutput += data . toString ( ) )
}
} ) ;
core . debug ( versionOutput . trim ( ) ) ;
return versionOutput . toUpperCase ( ) . includes ( "GNU TAR" ) ;
} ) ;
}
exports . isGnuTar = isGnuTar ;
function getTarPath ( args ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
// Explicitly use BSD Tar on Windows
const IS _WINDOWS = process . platform === "win32" ;
@ -2994,7 +3007,7 @@ function getTarPath() {
if ( fs _1 . existsSync ( systemTar ) ) {
return systemTar ;
}
else if ( isGnuTar ( ) ) {
else if ( yield isGnuTar ( ) ) {
args . push ( "--force-local" ) ;
}
}
@ -3002,10 +3015,10 @@ function getTarPath() {
} ) ;
}
function execTar ( args ) {
var _a , _b ;
var _a ;
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
try {
yield exec _1 . exec ( ` " ${ yield getTarPath ( ) } " ` , args ) ;
yield exec _1 . exec ( ` " ${ yield getTarPath ( args ) } " ` , args ) ;
}
catch ( error ) {
throw new Error ( ` Tar failed with error: ${ ( _a = error ) === null || _a === void 0 ? void 0 : _a . message } ` ) ;
@ -3016,14 +3029,27 @@ function extractTar(archivePath, targetDirectory) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
// Create directory to extract tar into
yield io . mkdirP ( targetDirectory ) ;
const args = [ "-xz" , "-f" , archivePath , "-C" , targetDirectory ] ;
const args = [
"-xz" ,
"-f" ,
archivePath . replace ( new RegExp ( "\\" + path . sep , "g" ) , "/" ) ,
"-C" ,
targetDirectory . replace ( new RegExp ( "\\" + path . sep , "g" ) , "/" )
] ;
yield execTar ( args ) ;
} ) ;
}
exports . extractTar = extractTar ;
function createTar ( archivePath , sourceDirectory ) {
return _ _awaiter ( this , void 0 , void 0 , function * ( ) {
const args = [ "-cz" , "-f" , archivePath , "-C" , sourceDirectory , "." ] ;
const args = [
"-cz" ,
"-f" ,
archivePath . replace ( new RegExp ( "\\" + path . sep , "g" ) , "/" ) ,
"-C" ,
sourceDirectory . replace ( new RegExp ( "\\" + path . sep , "g" ) , "/" ) ,
"."
] ;
yield execTar ( args ) ;
} ) ;
}
@ -3047,10 +3073,12 @@ function getProxyUrl(reqUrl) {
}
let proxyVar ;
if ( usingSsl ) {
proxyVar = process . env [ 'https_proxy' ] || process . env [ 'HTTPS_PROXY' ] ;
proxyVar = process . env [ "https_proxy" ] ||
process . env [ "HTTPS_PROXY" ] ;
}
else {
proxyVar = process . env [ 'http_proxy' ] || process . env [ 'HTTP_PROXY' ] ;
proxyVar = process . env [ "http_proxy" ] ||
process . env [ "HTTP_PROXY" ] ;
}
if ( proxyVar ) {
proxyUrl = url . parse ( proxyVar ) ;
@ -3062,7 +3090,7 @@ function checkBypass(reqUrl) {
if ( ! reqUrl . hostname ) {
return false ;
}
let noProxy = process . env [ 'no_proxy' ] || process . env [ 'NO_PROXY' ] || '' ;
let noProxy = process . env [ "no_proxy" ] || process . env [ "NO_PROXY" ] || '' ;
if ( ! noProxy ) {
return false ;
}
@ -3083,10 +3111,7 @@ function checkBypass(reqUrl) {
upperReqHosts . push ( ` ${ upperReqHosts [ 0 ] } : ${ reqPort } ` ) ;
}
// Compare request host against noproxy
for ( let upperNoProxyItem of noProxy
. split ( ',' )
. map ( x => x . trim ( ) . toUpperCase ( ) )
. filter ( x => x ) ) {
for ( let upperNoProxyItem of noProxy . split ( ',' ) . map ( x => x . trim ( ) . toUpperCase ( ) ) . filter ( x => x ) ) {
if ( upperReqHosts . some ( x => x === upperNoProxyItem ) ) {
return true ;
}