mirror of
				https://git.mirrors.martin98.com/https://github.com/actions/setup-python
				synced 2025-10-31 08:51:06 +08:00 
			
		
		
		
	Merge branch 'main' into ResolveVersionFix
This commit is contained in:
		
						commit
						e29a7c89f6
					
				
							
								
								
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| --- | ||||
| name: "@actions/cache" | ||||
| version: 2.0.2 | ||||
| version: 3.0.0 | ||||
| type: npm | ||||
| summary: Actions cache lib | ||||
| homepage: https://github.com/actions/toolkit/tree/main/packages/cache | ||||
|  | ||||
							
								
								
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.licenses/npm/@actions/http-client-1.0.11.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| --- | ||||
| name: "@actions/http-client" | ||||
| version: 1.0.11 | ||||
| type: npm | ||||
| summary: Actions Http Client | ||||
| homepage: https://github.com/actions/http-client#readme | ||||
| license: mit | ||||
| licenses: | ||||
| - sources: LICENSE | ||||
|   text: | | ||||
|     Actions Http Client for Node.js | ||||
| 
 | ||||
|     Copyright (c) GitHub, Inc. | ||||
| 
 | ||||
|     All rights reserved. | ||||
| 
 | ||||
|     MIT License | ||||
| 
 | ||||
|     Permission is hereby granted, free of charge, to any person obtaining a copy of this software and | ||||
|     associated documentation files (the "Software"), to deal in the Software without restriction, | ||||
|     including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
|     and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|     subject to the following conditions: | ||||
| 
 | ||||
|     The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||
| 
 | ||||
|     THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT | ||||
|     LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | ||||
|     NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||
|     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
|     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| notices: [] | ||||
							
								
								
									
										32
									
								
								.licenses/npm/@actions/http-client-2.0.1.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.licenses/npm/@actions/http-client-2.0.1.dep.yml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| --- | ||||
| name: "@actions/http-client" | ||||
| version: 2.0.1 | ||||
| type: npm | ||||
| summary: Actions Http Client | ||||
| homepage: https://github.com/actions/http-client#readme | ||||
| license: mit | ||||
| licenses: | ||||
| - sources: LICENSE | ||||
|   text: | | ||||
|     Actions Http Client for Node.js | ||||
| 
 | ||||
|     Copyright (c) GitHub, Inc. | ||||
| 
 | ||||
|     All rights reserved. | ||||
| 
 | ||||
|     MIT License | ||||
| 
 | ||||
|     Permission is hereby granted, free of charge, to any person obtaining a copy of this software and | ||||
|     associated documentation files (the "Software"), to deal in the Software without restriction, | ||||
|     including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
|     and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, | ||||
|     subject to the following conditions: | ||||
| 
 | ||||
|     The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | ||||
| 
 | ||||
|     THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT | ||||
|     LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | ||||
|     NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||||
|     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||||
|     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
| notices: [] | ||||
| @ -212,6 +212,59 @@ describe('run', () => { | ||||
|       ); | ||||
|       expect(setFailedSpy).not.toHaveBeenCalled(); | ||||
|     }); | ||||
| 
 | ||||
|     it('saves with -1 cacheId , should not fail workflow', async () => { | ||||
|       inputs['cache'] = 'poetry'; | ||||
|       getStateSpy.mockImplementation((name: string) => { | ||||
|         if (name === State.STATE_CACHE_PRIMARY_KEY) { | ||||
|           return poetryLockHash; | ||||
|         } else if (name === State.CACHE_PATHS) { | ||||
|           return JSON.stringify([__dirname]); | ||||
|         } else { | ||||
|           return requirementsHash; | ||||
|         } | ||||
|       }); | ||||
| 
 | ||||
|       saveCacheSpy.mockImplementation(() => { | ||||
|         return -1; | ||||
|       }); | ||||
| 
 | ||||
|       await run(); | ||||
| 
 | ||||
|       expect(getInputSpy).toHaveBeenCalled(); | ||||
|       expect(getStateSpy).toHaveBeenCalledTimes(3); | ||||
|       expect(infoSpy).not.toHaveBeenCalled(); | ||||
|       expect(saveCacheSpy).toHaveBeenCalled(); | ||||
|       expect(infoSpy).not.toHaveBeenLastCalledWith( | ||||
|         `Cache saved with the key: ${poetryLockHash}` | ||||
|       ); | ||||
|       expect(setFailedSpy).not.toHaveBeenCalled(); | ||||
|     }); | ||||
| 
 | ||||
|     it('saves with error from toolkit, should fail workflow', async () => { | ||||
|       inputs['cache'] = 'npm'; | ||||
|       getStateSpy.mockImplementation((name: string) => { | ||||
|         if (name === State.STATE_CACHE_PRIMARY_KEY) { | ||||
|           return poetryLockHash; | ||||
|         } else if (name === State.CACHE_PATHS) { | ||||
|           return JSON.stringify([__dirname]); | ||||
|         } else { | ||||
|           return requirementsHash; | ||||
|         } | ||||
|       }); | ||||
| 
 | ||||
|       saveCacheSpy.mockImplementation(() => { | ||||
|         throw new cache.ValidationError('Validation failed'); | ||||
|       }); | ||||
| 
 | ||||
|       await run(); | ||||
| 
 | ||||
|       expect(getInputSpy).toHaveBeenCalled(); | ||||
|       expect(getStateSpy).toHaveBeenCalledTimes(3); | ||||
|       expect(infoSpy).not.toHaveBeenCalledWith(); | ||||
|       expect(saveCacheSpy).toHaveBeenCalled(); | ||||
|       expect(setFailedSpy).toHaveBeenCalled(); | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|  | ||||
							
								
								
									
										847
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										847
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							| @ -90,17 +90,18 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|             checkKey(key); | ||||
|         } | ||||
|         const compressionMethod = yield utils.getCompressionMethod(); | ||||
|         // path are needed to compute version
 | ||||
|         const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||||
|             compressionMethod | ||||
|         }); | ||||
|         if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { | ||||
|             // Cache not found
 | ||||
|             return undefined; | ||||
|         } | ||||
|         const archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|         core.debug(`Archive Path: ${archivePath}`); | ||||
|         let archivePath = ''; | ||||
|         try { | ||||
|             // path are needed to compute version
 | ||||
|             const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||||
|                 compressionMethod | ||||
|             }); | ||||
|             if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
|             yield cacheHttpClient.downloadCache(cacheEntry.archiveLocation, archivePath, options); | ||||
|             if (core.isDebug()) { | ||||
| @ -110,6 +111,17 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|             core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`); | ||||
|             yield tar_1.extractTar(archivePath, compressionMethod); | ||||
|             core.info('Cache restored successfully'); | ||||
|             return cacheEntry.cacheKey; | ||||
|         } | ||||
|         catch (error) { | ||||
|             const typedError = error; | ||||
|             if (typedError.name === ValidationError.name) { | ||||
|                 throw error; | ||||
|             } | ||||
|             else { | ||||
|                 // Supress all non-validation cache related errors because caching should be optional
 | ||||
|                 core.warning(`Failed to restore: ${error.message}`); | ||||
|             } | ||||
|         } | ||||
|         finally { | ||||
|             // Try to delete the archive to save space
 | ||||
| @ -120,7 +132,7 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|                 core.debug(`Failed to delete archive: ${error}`); | ||||
|             } | ||||
|         } | ||||
|         return cacheEntry.cacheKey; | ||||
|         return undefined; | ||||
|     }); | ||||
| } | ||||
| exports.restoreCache = restoreCache; | ||||
| @ -138,10 +150,13 @@ function saveCache(paths, key, options) { | ||||
|         checkPaths(paths); | ||||
|         checkKey(key); | ||||
|         const compressionMethod = yield utils.getCompressionMethod(); | ||||
|         let cacheId = null; | ||||
|         let cacheId = -1; | ||||
|         const cachePaths = yield utils.resolvePaths(paths); | ||||
|         core.debug('Cache Paths:'); | ||||
|         core.debug(`${JSON.stringify(cachePaths)}`); | ||||
|         if (cachePaths.length === 0) { | ||||
|             throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`); | ||||
|         } | ||||
|         const archiveFolder = yield utils.createTempDirectory(); | ||||
|         const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod)); | ||||
|         core.debug(`Archive Path: ${archivePath}`); | ||||
| @ -174,6 +189,18 @@ function saveCache(paths, key, options) { | ||||
|             core.debug(`Saving Cache (ID: ${cacheId})`); | ||||
|             yield cacheHttpClient.saveCache(cacheId, archivePath, options); | ||||
|         } | ||||
|         catch (error) { | ||||
|             const typedError = error; | ||||
|             if (typedError.name === ValidationError.name) { | ||||
|                 throw error; | ||||
|             } | ||||
|             else if (typedError.name === ReserveCacheError.name) { | ||||
|                 core.info(`Failed to save: ${typedError.message}`); | ||||
|             } | ||||
|             else { | ||||
|                 core.warning(`Failed to save: ${typedError.message}`); | ||||
|             } | ||||
|         } | ||||
|         finally { | ||||
|             // Try to delete the archive to save space
 | ||||
|             try { | ||||
| @ -214,8 +241,8 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const auth_1 = __nccwpck_require__(2001); | ||||
| const crypto = __importStar(__nccwpck_require__(6113)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| const url_1 = __nccwpck_require__(7310); | ||||
| @ -647,7 +674,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const storage_blob_1 = __nccwpck_require__(4100); | ||||
| const buffer = __importStar(__nccwpck_require__(4300)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -885,7 +912,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const constants_1 = __nccwpck_require__(8840); | ||||
| function isSuccessStatusCode(statusCode) { | ||||
|     if (!statusCode) { | ||||
| @ -962,7 +989,7 @@ function retryTypedResponse(name, method, maxAttempts = constants_1.DefaultRetry | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         return yield retry(name, method, (response) => response.statusCode, maxAttempts, delay,  | ||||
|         // If the error object contains the statusCode property, extract it and return
 | ||||
|         // an ITypedResponse<T> so it can be processed by the retry logic.
 | ||||
|         // an TypedResponse<T> so it can be processed by the retry logic.
 | ||||
|         (error) => { | ||||
|             if (error instanceof http_client_1.HttpClientError) { | ||||
|                 return { | ||||
| @ -1120,6 +1147,8 @@ function createTar(archiveFolder, sourceDirectories, compressionMethod) { | ||||
|             ...getCompressionProgram(), | ||||
|             '-cf', | ||||
|             cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
|             '--exclude', | ||||
|             cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
|             '-P', | ||||
|             '-C', | ||||
|             workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
| @ -2292,6 +2321,774 @@ exports.SearchState = SearchState; | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 2001: | ||||
| /***/ (function(__unused_webpack_module, exports) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Bearer ${this.token}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| //# sourceMappingURL=auth.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 1825: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; | ||||
| const http = __importStar(__nccwpck_require__(3685)); | ||||
| const https = __importStar(__nccwpck_require__(5687)); | ||||
| const pm = __importStar(__nccwpck_require__(4977)); | ||||
| const tunnel = __importStar(__nccwpck_require__(4294)); | ||||
| var HttpCodes; | ||||
| (function (HttpCodes) { | ||||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK"; | ||||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; | ||||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; | ||||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; | ||||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; | ||||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; | ||||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; | ||||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; | ||||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; | ||||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; | ||||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; | ||||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; | ||||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; | ||||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; | ||||
|     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"; | ||||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; | ||||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; | ||||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); | ||||
| var Headers; | ||||
| (function (Headers) { | ||||
|     Headers["Accept"] = "accept"; | ||||
|     Headers["ContentType"] = "content-type"; | ||||
| })(Headers = exports.Headers || (exports.Headers = {})); | ||||
| var MediaTypes; | ||||
| (function (MediaTypes) { | ||||
|     MediaTypes["ApplicationJson"] = "application/json"; | ||||
| })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); | ||||
| /** | ||||
|  * Returns the proxy URL, depending upon the supplied url and proxy environment variables. | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     const proxyUrl = pm.getProxyUrl(new URL(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 RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
|     } | ||||
|     readBody() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { | ||||
|                 let output = Buffer.alloc(0); | ||||
|                 this.message.on('data', (chunk) => { | ||||
|                     output = Buffer.concat([output, chunk]); | ||||
|                 }); | ||||
|                 this.message.on('end', () => { | ||||
|                     resolve(output.toString()); | ||||
|                 }); | ||||
|             })); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     const parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| class HttpClient { | ||||
|     constructor(userAgent, handlers, requestOptions) { | ||||
|         this._ignoreSslError = false; | ||||
|         this._allowRedirects = true; | ||||
|         this._allowRedirectDowngrade = false; | ||||
|         this._maxRedirects = 50; | ||||
|         this._allowRetries = false; | ||||
|         this._maxRetries = 1; | ||||
|         this._keepAlive = false; | ||||
|         this._disposed = false; | ||||
|         this.userAgent = userAgent; | ||||
|         this.handlers = handlers || []; | ||||
|         this.requestOptions = requestOptions; | ||||
|         if (requestOptions) { | ||||
|             if (requestOptions.ignoreSslError != null) { | ||||
|                 this._ignoreSslError = requestOptions.ignoreSslError; | ||||
|             } | ||||
|             this._socketTimeout = requestOptions.socketTimeout; | ||||
|             if (requestOptions.allowRedirects != null) { | ||||
|                 this._allowRedirects = requestOptions.allowRedirects; | ||||
|             } | ||||
|             if (requestOptions.allowRedirectDowngrade != null) { | ||||
|                 this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; | ||||
|             } | ||||
|             if (requestOptions.maxRedirects != null) { | ||||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); | ||||
|             } | ||||
|             if (requestOptions.keepAlive != null) { | ||||
|                 this._keepAlive = requestOptions.keepAlive; | ||||
|             } | ||||
|             if (requestOptions.allowRetries != null) { | ||||
|                 this._allowRetries = requestOptions.allowRetries; | ||||
|             } | ||||
|             if (requestOptions.maxRetries != null) { | ||||
|                 this._maxRetries = requestOptions.maxRetries; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     options(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     get(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('GET', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     del(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('DELETE', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     post(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('POST', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     patch(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('PATCH', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     put(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('PUT', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     head(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     sendStream(verb, requestUrl, stream, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request(verb, requestUrl, stream, additionalHeaders); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Gets a typed object from an endpoint | ||||
|      * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise | ||||
|      */ | ||||
|     getJson(requestUrl, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.get(requestUrl, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     postJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.post(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     putJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.put(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     patchJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.patch(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Makes a raw http request. | ||||
|      * All other methods such as get, post, patch, and request ultimately call this. | ||||
|      * Prefer get, del, post and patch | ||||
|      */ | ||||
|     request(verb, requestUrl, data, headers) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             if (this._disposed) { | ||||
|                 throw new Error('Client has already been disposed.'); | ||||
|             } | ||||
|             const parsedUrl = new URL(requestUrl); | ||||
|             let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|             // Only perform retries on reads since writes may not be idempotent.
 | ||||
|             const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) | ||||
|                 ? this._maxRetries + 1 | ||||
|                 : 1; | ||||
|             let numTries = 0; | ||||
|             let response; | ||||
|             do { | ||||
|                 response = yield this.requestRaw(info, data); | ||||
|                 // Check if it's an authentication challenge
 | ||||
|                 if (response && | ||||
|                     response.message && | ||||
|                     response.message.statusCode === HttpCodes.Unauthorized) { | ||||
|                     let authenticationHandler; | ||||
|                     for (const handler of this.handlers) { | ||||
|                         if (handler.canHandleAuthentication(response)) { | ||||
|                             authenticationHandler = handler; | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                     if (authenticationHandler) { | ||||
|                         return authenticationHandler.handleAuthentication(this, info, data); | ||||
|                     } | ||||
|                     else { | ||||
|                         // We have received an unauthorized response but have no handlers to handle it.
 | ||||
|                         // Let the response return to the caller.
 | ||||
|                         return response; | ||||
|                     } | ||||
|                 } | ||||
|                 let redirectsRemaining = this._maxRedirects; | ||||
|                 while (response.message.statusCode && | ||||
|                     HttpRedirectCodes.includes(response.message.statusCode) && | ||||
|                     this._allowRedirects && | ||||
|                     redirectsRemaining > 0) { | ||||
|                     const redirectUrl = response.message.headers['location']; | ||||
|                     if (!redirectUrl) { | ||||
|                         // if there's no location to redirect to, we won't
 | ||||
|                         break; | ||||
|                     } | ||||
|                     const parsedRedirectUrl = new URL(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.'); | ||||
|                     } | ||||
|                     // we need to finish reading the response before reassigning response
 | ||||
|                     // which will leak the open socket.
 | ||||
|                     yield response.readBody(); | ||||
|                     // strip authorization header if redirected to a different hostname
 | ||||
|                     if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { | ||||
|                         for (const 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 = yield this.requestRaw(info, data); | ||||
|                     redirectsRemaining--; | ||||
|                 } | ||||
|                 if (!response.message.statusCode || | ||||
|                     !HttpResponseRetryCodes.includes(response.message.statusCode)) { | ||||
|                     // If not a retry code, return immediately instead of retrying
 | ||||
|                     return response; | ||||
|                 } | ||||
|                 numTries += 1; | ||||
|                 if (numTries < maxTries) { | ||||
|                     yield response.readBody(); | ||||
|                     yield this._performExponentialBackoff(numTries); | ||||
|                 } | ||||
|             } while (numTries < maxTries); | ||||
|             return response; | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Needs to be called if keepAlive is set to true in request options. | ||||
|      */ | ||||
|     dispose() { | ||||
|         if (this._agent) { | ||||
|             this._agent.destroy(); | ||||
|         } | ||||
|         this._disposed = true; | ||||
|     } | ||||
|     /** | ||||
|      * Raw request. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      */ | ||||
|     requestRaw(info, data) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve, reject) => { | ||||
|                 function callbackForResult(err, res) { | ||||
|                     if (err) { | ||||
|                         reject(err); | ||||
|                     } | ||||
|                     else if (!res) { | ||||
|                         // If `err` is not passed, then `res` must be passed.
 | ||||
|                         reject(new Error('Unknown error')); | ||||
|                     } | ||||
|                     else { | ||||
|                         resolve(res); | ||||
|                     } | ||||
|                 } | ||||
|                 this.requestRawWithCallback(info, data, callbackForResult); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Raw request with callback. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      * @param onResult | ||||
|      */ | ||||
|     requestRawWithCallback(info, data, onResult) { | ||||
|         if (typeof data === 'string') { | ||||
|             if (!info.options.headers) { | ||||
|                 info.options.headers = {}; | ||||
|             } | ||||
|             info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); | ||||
|         } | ||||
|         let callbackCalled = false; | ||||
|         function handleResult(err, res) { | ||||
|             if (!callbackCalled) { | ||||
|                 callbackCalled = true; | ||||
|                 onResult(err, res); | ||||
|             } | ||||
|         } | ||||
|         const req = info.httpModule.request(info.options, (msg) => { | ||||
|             const res = new HttpClientResponse(msg); | ||||
|             handleResult(undefined, res); | ||||
|         }); | ||||
|         let socket; | ||||
|         req.on('socket', sock => { | ||||
|             socket = sock; | ||||
|         }); | ||||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||||
|             if (socket) { | ||||
|                 socket.end(); | ||||
|             } | ||||
|             handleResult(new Error(`Request timeout: ${info.options.path}`)); | ||||
|         }); | ||||
|         req.on('error', function (err) { | ||||
|             // err has statusCode property
 | ||||
|             // res should have headers
 | ||||
|             handleResult(err); | ||||
|         }); | ||||
|         if (data && typeof data === 'string') { | ||||
|             req.write(data, 'utf8'); | ||||
|         } | ||||
|         if (data && typeof data !== 'string') { | ||||
|             data.on('close', function () { | ||||
|                 req.end(); | ||||
|             }); | ||||
|             data.pipe(req); | ||||
|         } | ||||
|         else { | ||||
|             req.end(); | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * Gets an http agent. This function is useful when you need an http agent that handles | ||||
|      * routing through a proxy server - depending upon the url and proxy environment variables. | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         const parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
|         const info = {}; | ||||
|         info.parsedUrl = requestUrl; | ||||
|         const usingSsl = info.parsedUrl.protocol === 'https:'; | ||||
|         info.httpModule = usingSsl ? https : http; | ||||
|         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.method = method; | ||||
|         info.options.headers = this._mergeHeaders(headers); | ||||
|         if (this.userAgent != null) { | ||||
|             info.options.headers['user-agent'] = this.userAgent; | ||||
|         } | ||||
|         info.options.agent = this._getAgent(info.parsedUrl); | ||||
|         // gives handlers an opportunity to participate
 | ||||
|         if (this.handlers) { | ||||
|             for (const handler of this.handlers) { | ||||
|                 handler.prepareRequest(info.options); | ||||
|             } | ||||
|         } | ||||
|         return info; | ||||
|     } | ||||
|     _mergeHeaders(headers) { | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); | ||||
|         } | ||||
|         return lowercaseKeys(headers || {}); | ||||
|     } | ||||
|     _getExistingOrDefaultHeader(additionalHeaders, header, _default) { | ||||
|         let clientHeader; | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; | ||||
|         } | ||||
|         return additionalHeaders[header] || clientHeader || _default; | ||||
|     } | ||||
|     _getAgent(parsedUrl) { | ||||
|         let agent; | ||||
|         const proxyUrl = pm.getProxyUrl(parsedUrl); | ||||
|         const useProxy = proxyUrl && proxyUrl.hostname; | ||||
|         if (this._keepAlive && useProxy) { | ||||
|             agent = this._proxyAgent; | ||||
|         } | ||||
|         if (this._keepAlive && !useProxy) { | ||||
|             agent = this._agent; | ||||
|         } | ||||
|         // if agent is already assigned use that agent.
 | ||||
|         if (agent) { | ||||
|             return agent; | ||||
|         } | ||||
|         const usingSsl = parsedUrl.protocol === 'https:'; | ||||
|         let maxSockets = 100; | ||||
|         if (this.requestOptions) { | ||||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; | ||||
|         } | ||||
|         // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.
 | ||||
|         if (proxyUrl && proxyUrl.hostname) { | ||||
|             const agentOptions = { | ||||
|                 maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { | ||||
|                     proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                 })), { host: proxyUrl.hostname, port: proxyUrl.port }) | ||||
|             }; | ||||
|             let tunnelAgent; | ||||
|             const overHttps = proxyUrl.protocol === 'https:'; | ||||
|             if (usingSsl) { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; | ||||
|             } | ||||
|             else { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; | ||||
|             } | ||||
|             agent = tunnelAgent(agentOptions); | ||||
|             this._proxyAgent = agent; | ||||
|         } | ||||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||||
|         if (this._keepAlive && !agent) { | ||||
|             const options = { keepAlive: this._keepAlive, maxSockets }; | ||||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options); | ||||
|             this._agent = agent; | ||||
|         } | ||||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||||
|         if (!agent) { | ||||
|             agent = usingSsl ? https.globalAgent : http.globalAgent; | ||||
|         } | ||||
|         if (usingSsl && this._ignoreSslError) { | ||||
|             // 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 | ||||
|             }); | ||||
|         } | ||||
|         return agent; | ||||
|     } | ||||
|     _performExponentialBackoff(retryNumber) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); | ||||
|             const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); | ||||
|             return new Promise(resolve => setTimeout(() => resolve(), ms)); | ||||
|         }); | ||||
|     } | ||||
|     _processResponse(res, options) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { | ||||
|                 const statusCode = res.message.statusCode || 0; | ||||
|                 const response = { | ||||
|                     statusCode, | ||||
|                     result: null, | ||||
|                     headers: {} | ||||
|                 }; | ||||
|                 // not found leads to null obj returned
 | ||||
|                 if (statusCode === HttpCodes.NotFound) { | ||||
|                     resolve(response); | ||||
|                 } | ||||
|                 // get the result from the body
 | ||||
|                 function dateTimeDeserializer(key, value) { | ||||
|                     if (typeof value === 'string') { | ||||
|                         const a = new Date(value); | ||||
|                         if (!isNaN(a.valueOf())) { | ||||
|                             return a; | ||||
|                         } | ||||
|                     } | ||||
|                     return value; | ||||
|                 } | ||||
|                 let obj; | ||||
|                 let contents; | ||||
|                 try { | ||||
|                     contents = yield res.readBody(); | ||||
|                     if (contents && contents.length > 0) { | ||||
|                         if (options && options.deserializeDates) { | ||||
|                             obj = JSON.parse(contents, dateTimeDeserializer); | ||||
|                         } | ||||
|                         else { | ||||
|                             obj = JSON.parse(contents); | ||||
|                         } | ||||
|                         response.result = obj; | ||||
|                     } | ||||
|                     response.headers = res.message.headers; | ||||
|                 } | ||||
|                 catch (err) { | ||||
|                     // Invalid resource (contents not json);  leaving result obj null
 | ||||
|                 } | ||||
|                 // note that 3xx redirects are handled by the http layer.
 | ||||
|                 if (statusCode > 299) { | ||||
|                     let msg; | ||||
|                     // if exception/error in body, attempt to get better error
 | ||||
|                     if (obj && obj.message) { | ||||
|                         msg = obj.message; | ||||
|                     } | ||||
|                     else if (contents && contents.length > 0) { | ||||
|                         // it may be the case that the exception is in the body message as string
 | ||||
|                         msg = contents; | ||||
|                     } | ||||
|                     else { | ||||
|                         msg = `Failed request: (${statusCode})`; | ||||
|                     } | ||||
|                     const err = new HttpClientError(msg, statusCode); | ||||
|                     err.result = response.result; | ||||
|                     reject(err); | ||||
|                 } | ||||
|                 else { | ||||
|                     resolve(response); | ||||
|                 } | ||||
|             })); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClient = HttpClient; | ||||
| const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
| //# sourceMappingURL=index.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 4977: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.checkBypass = exports.getProxyUrl = void 0; | ||||
| function getProxyUrl(reqUrl) { | ||||
|     const usingSsl = reqUrl.protocol === 'https:'; | ||||
|     if (checkBypass(reqUrl)) { | ||||
|         return undefined; | ||||
|     } | ||||
|     const proxyVar = (() => { | ||||
|         if (usingSsl) { | ||||
|             return process.env['https_proxy'] || process.env['HTTPS_PROXY']; | ||||
|         } | ||||
|         else { | ||||
|             return process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|         } | ||||
|     })(); | ||||
|     if (proxyVar) { | ||||
|         return new URL(proxyVar); | ||||
|     } | ||||
|     else { | ||||
|         return undefined; | ||||
|     } | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| function checkBypass(reqUrl) { | ||||
|     if (!reqUrl.hostname) { | ||||
|         return false; | ||||
|     } | ||||
|     const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; | ||||
|     if (!noProxy) { | ||||
|         return false; | ||||
|     } | ||||
|     // Determine the request port
 | ||||
|     let reqPort; | ||||
|     if (reqUrl.port) { | ||||
|         reqPort = Number(reqUrl.port); | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'http:') { | ||||
|         reqPort = 80; | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'https:') { | ||||
|         reqPort = 443; | ||||
|     } | ||||
|     // Format the request hostname and hostname with port
 | ||||
|     const upperReqHosts = [reqUrl.hostname.toUpperCase()]; | ||||
|     if (typeof reqPort === 'number') { | ||||
|         upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); | ||||
|     } | ||||
|     // Compare request host against noproxy
 | ||||
|     for (const upperNoProxyItem of noProxy | ||||
|         .split(',') | ||||
|         .map(x => x.trim().toUpperCase()) | ||||
|         .filter(x => x)) { | ||||
|         if (upperReqHosts.some(x => x === upperNoProxyItem)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| exports.checkBypass = checkBypass; | ||||
| //# sourceMappingURL=proxy.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3771: | ||||
| /***/ ((module, exports) => { | ||||
| 
 | ||||
| @ -58120,19 +58917,11 @@ function saveCache(packageManager) { | ||||
|             core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); | ||||
|             return; | ||||
|         } | ||||
|         try { | ||||
|             yield cache.saveCache(cachePaths, primaryKey); | ||||
|             core.info(`Cache saved with the key: ${primaryKey}`); | ||||
|         } | ||||
|         catch (error) { | ||||
|             const err = error; | ||||
|             if (err.name === cache.ReserveCacheError.name) { | ||||
|                 core.info(err.message); | ||||
|             } | ||||
|             else { | ||||
|                 throw error; | ||||
|             } | ||||
|         const cacheId = yield cache.saveCache(cachePaths, primaryKey); | ||||
|         if (cacheId == -1) { | ||||
|             return; | ||||
|         } | ||||
|         core.info(`Cache saved with the key: ${primaryKey}`); | ||||
|     }); | ||||
| } | ||||
| function isCacheDirectoryExists(cacheDirectory) { | ||||
|  | ||||
							
								
								
									
										831
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										831
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -90,17 +90,18 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|             checkKey(key); | ||||
|         } | ||||
|         const compressionMethod = yield utils.getCompressionMethod(); | ||||
|         // path are needed to compute version
 | ||||
|         const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||||
|             compressionMethod | ||||
|         }); | ||||
|         if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { | ||||
|             // Cache not found
 | ||||
|             return undefined; | ||||
|         } | ||||
|         const archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|         core.debug(`Archive Path: ${archivePath}`); | ||||
|         let archivePath = ''; | ||||
|         try { | ||||
|             // path are needed to compute version
 | ||||
|             const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||||
|                 compressionMethod | ||||
|             }); | ||||
|             if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
|             yield cacheHttpClient.downloadCache(cacheEntry.archiveLocation, archivePath, options); | ||||
|             if (core.isDebug()) { | ||||
| @ -110,6 +111,17 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|             core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`); | ||||
|             yield tar_1.extractTar(archivePath, compressionMethod); | ||||
|             core.info('Cache restored successfully'); | ||||
|             return cacheEntry.cacheKey; | ||||
|         } | ||||
|         catch (error) { | ||||
|             const typedError = error; | ||||
|             if (typedError.name === ValidationError.name) { | ||||
|                 throw error; | ||||
|             } | ||||
|             else { | ||||
|                 // Supress all non-validation cache related errors because caching should be optional
 | ||||
|                 core.warning(`Failed to restore: ${error.message}`); | ||||
|             } | ||||
|         } | ||||
|         finally { | ||||
|             // Try to delete the archive to save space
 | ||||
| @ -120,7 +132,7 @@ function restoreCache(paths, primaryKey, restoreKeys, options) { | ||||
|                 core.debug(`Failed to delete archive: ${error}`); | ||||
|             } | ||||
|         } | ||||
|         return cacheEntry.cacheKey; | ||||
|         return undefined; | ||||
|     }); | ||||
| } | ||||
| exports.restoreCache = restoreCache; | ||||
| @ -138,10 +150,13 @@ function saveCache(paths, key, options) { | ||||
|         checkPaths(paths); | ||||
|         checkKey(key); | ||||
|         const compressionMethod = yield utils.getCompressionMethod(); | ||||
|         let cacheId = null; | ||||
|         let cacheId = -1; | ||||
|         const cachePaths = yield utils.resolvePaths(paths); | ||||
|         core.debug('Cache Paths:'); | ||||
|         core.debug(`${JSON.stringify(cachePaths)}`); | ||||
|         if (cachePaths.length === 0) { | ||||
|             throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`); | ||||
|         } | ||||
|         const archiveFolder = yield utils.createTempDirectory(); | ||||
|         const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod)); | ||||
|         core.debug(`Archive Path: ${archivePath}`); | ||||
| @ -174,6 +189,18 @@ function saveCache(paths, key, options) { | ||||
|             core.debug(`Saving Cache (ID: ${cacheId})`); | ||||
|             yield cacheHttpClient.saveCache(cacheId, archivePath, options); | ||||
|         } | ||||
|         catch (error) { | ||||
|             const typedError = error; | ||||
|             if (typedError.name === ValidationError.name) { | ||||
|                 throw error; | ||||
|             } | ||||
|             else if (typedError.name === ReserveCacheError.name) { | ||||
|                 core.info(`Failed to save: ${typedError.message}`); | ||||
|             } | ||||
|             else { | ||||
|                 core.warning(`Failed to save: ${typedError.message}`); | ||||
|             } | ||||
|         } | ||||
|         finally { | ||||
|             // Try to delete the archive to save space
 | ||||
|             try { | ||||
| @ -214,8 +241,8 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const auth_1 = __nccwpck_require__(3702); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const auth_1 = __nccwpck_require__(2001); | ||||
| const crypto = __importStar(__nccwpck_require__(6113)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| const url_1 = __nccwpck_require__(7310); | ||||
| @ -647,7 +674,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const storage_blob_1 = __nccwpck_require__(4100); | ||||
| const buffer = __importStar(__nccwpck_require__(4300)); | ||||
| const fs = __importStar(__nccwpck_require__(7147)); | ||||
| @ -885,7 +912,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| const core = __importStar(__nccwpck_require__(2186)); | ||||
| const http_client_1 = __nccwpck_require__(9925); | ||||
| const http_client_1 = __nccwpck_require__(1825); | ||||
| const constants_1 = __nccwpck_require__(8840); | ||||
| function isSuccessStatusCode(statusCode) { | ||||
|     if (!statusCode) { | ||||
| @ -962,7 +989,7 @@ function retryTypedResponse(name, method, maxAttempts = constants_1.DefaultRetry | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         return yield retry(name, method, (response) => response.statusCode, maxAttempts, delay,  | ||||
|         // If the error object contains the statusCode property, extract it and return
 | ||||
|         // an ITypedResponse<T> so it can be processed by the retry logic.
 | ||||
|         // an TypedResponse<T> so it can be processed by the retry logic.
 | ||||
|         (error) => { | ||||
|             if (error instanceof http_client_1.HttpClientError) { | ||||
|                 return { | ||||
| @ -1120,6 +1147,8 @@ function createTar(archiveFolder, sourceDirectories, compressionMethod) { | ||||
|             ...getCompressionProgram(), | ||||
|             '-cf', | ||||
|             cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
|             '--exclude', | ||||
|             cacheFileName.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
|             '-P', | ||||
|             '-C', | ||||
|             workingDirectory.replace(new RegExp(`\\${path.sep}`, 'g'), '/'), | ||||
| @ -2292,6 +2321,774 @@ exports.SearchState = SearchState; | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 2001: | ||||
| /***/ (function(__unused_webpack_module, exports) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; | ||||
| class BasicCredentialHandler { | ||||
|     constructor(username, password) { | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|     } | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.BasicCredentialHandler = BasicCredentialHandler; | ||||
| class BearerCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Bearer ${this.token}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.BearerCredentialHandler = BearerCredentialHandler; | ||||
| class PersonalAccessTokenCredentialHandler { | ||||
|     constructor(token) { | ||||
|         this.token = token; | ||||
|     } | ||||
|     // currently implements pre-authorization
 | ||||
|     // TODO: support preAuth = false where it hooks on 401
 | ||||
|     prepareRequest(options) { | ||||
|         if (!options.headers) { | ||||
|             throw Error('The request has no headers'); | ||||
|         } | ||||
|         options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; | ||||
|     } | ||||
|     // This handler cannot handle 401
 | ||||
|     canHandleAuthentication() { | ||||
|         return false; | ||||
|     } | ||||
|     handleAuthentication() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             throw new Error('not implemented'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; | ||||
| //# sourceMappingURL=auth.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 1825: | ||||
| /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/no-explicit-any */ | ||||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||||
| }) : (function(o, m, k, k2) { | ||||
|     if (k2 === undefined) k2 = k; | ||||
|     o[k2] = m[k]; | ||||
| })); | ||||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||||
|     Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||||
| }) : function(o, v) { | ||||
|     o["default"] = v; | ||||
| }); | ||||
| var __importStar = (this && this.__importStar) || function (mod) { | ||||
|     if (mod && mod.__esModule) return mod; | ||||
|     var result = {}; | ||||
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||||
|     __setModuleDefault(result, mod); | ||||
|     return result; | ||||
| }; | ||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||||
|     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||||
|     return new (P || (P = Promise))(function (resolve, reject) { | ||||
|         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||||
|         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||||
|         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||||
|     }); | ||||
| }; | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; | ||||
| const http = __importStar(__nccwpck_require__(3685)); | ||||
| const https = __importStar(__nccwpck_require__(5687)); | ||||
| const pm = __importStar(__nccwpck_require__(4977)); | ||||
| const tunnel = __importStar(__nccwpck_require__(4294)); | ||||
| var HttpCodes; | ||||
| (function (HttpCodes) { | ||||
|     HttpCodes[HttpCodes["OK"] = 200] = "OK"; | ||||
|     HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; | ||||
|     HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; | ||||
|     HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; | ||||
|     HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; | ||||
|     HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; | ||||
|     HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; | ||||
|     HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; | ||||
|     HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; | ||||
|     HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; | ||||
|     HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; | ||||
|     HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; | ||||
|     HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; | ||||
|     HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; | ||||
|     HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; | ||||
|     HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; | ||||
|     HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; | ||||
|     HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; | ||||
|     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"; | ||||
|     HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; | ||||
|     HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; | ||||
| })(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); | ||||
| var Headers; | ||||
| (function (Headers) { | ||||
|     Headers["Accept"] = "accept"; | ||||
|     Headers["ContentType"] = "content-type"; | ||||
| })(Headers = exports.Headers || (exports.Headers = {})); | ||||
| var MediaTypes; | ||||
| (function (MediaTypes) { | ||||
|     MediaTypes["ApplicationJson"] = "application/json"; | ||||
| })(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); | ||||
| /** | ||||
|  * Returns the proxy URL, depending upon the supplied url and proxy environment variables. | ||||
|  * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|  */ | ||||
| function getProxyUrl(serverUrl) { | ||||
|     const proxyUrl = pm.getProxyUrl(new URL(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 RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; | ||||
| const ExponentialBackoffCeiling = 10; | ||||
| const ExponentialBackoffTimeSlice = 5; | ||||
| class HttpClientError extends Error { | ||||
|     constructor(message, statusCode) { | ||||
|         super(message); | ||||
|         this.name = 'HttpClientError'; | ||||
|         this.statusCode = statusCode; | ||||
|         Object.setPrototypeOf(this, HttpClientError.prototype); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientError = HttpClientError; | ||||
| class HttpClientResponse { | ||||
|     constructor(message) { | ||||
|         this.message = message; | ||||
|     } | ||||
|     readBody() { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { | ||||
|                 let output = Buffer.alloc(0); | ||||
|                 this.message.on('data', (chunk) => { | ||||
|                     output = Buffer.concat([output, chunk]); | ||||
|                 }); | ||||
|                 this.message.on('end', () => { | ||||
|                     resolve(output.toString()); | ||||
|                 }); | ||||
|             })); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClientResponse = HttpClientResponse; | ||||
| function isHttps(requestUrl) { | ||||
|     const parsedUrl = new URL(requestUrl); | ||||
|     return parsedUrl.protocol === 'https:'; | ||||
| } | ||||
| exports.isHttps = isHttps; | ||||
| class HttpClient { | ||||
|     constructor(userAgent, handlers, requestOptions) { | ||||
|         this._ignoreSslError = false; | ||||
|         this._allowRedirects = true; | ||||
|         this._allowRedirectDowngrade = false; | ||||
|         this._maxRedirects = 50; | ||||
|         this._allowRetries = false; | ||||
|         this._maxRetries = 1; | ||||
|         this._keepAlive = false; | ||||
|         this._disposed = false; | ||||
|         this.userAgent = userAgent; | ||||
|         this.handlers = handlers || []; | ||||
|         this.requestOptions = requestOptions; | ||||
|         if (requestOptions) { | ||||
|             if (requestOptions.ignoreSslError != null) { | ||||
|                 this._ignoreSslError = requestOptions.ignoreSslError; | ||||
|             } | ||||
|             this._socketTimeout = requestOptions.socketTimeout; | ||||
|             if (requestOptions.allowRedirects != null) { | ||||
|                 this._allowRedirects = requestOptions.allowRedirects; | ||||
|             } | ||||
|             if (requestOptions.allowRedirectDowngrade != null) { | ||||
|                 this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; | ||||
|             } | ||||
|             if (requestOptions.maxRedirects != null) { | ||||
|                 this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); | ||||
|             } | ||||
|             if (requestOptions.keepAlive != null) { | ||||
|                 this._keepAlive = requestOptions.keepAlive; | ||||
|             } | ||||
|             if (requestOptions.allowRetries != null) { | ||||
|                 this._allowRetries = requestOptions.allowRetries; | ||||
|             } | ||||
|             if (requestOptions.maxRetries != null) { | ||||
|                 this._maxRetries = requestOptions.maxRetries; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     options(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     get(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('GET', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     del(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('DELETE', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     post(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('POST', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     patch(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('PATCH', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     put(requestUrl, data, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('PUT', requestUrl, data, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     head(requestUrl, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request('HEAD', requestUrl, null, additionalHeaders || {}); | ||||
|         }); | ||||
|     } | ||||
|     sendStream(verb, requestUrl, stream, additionalHeaders) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return this.request(verb, requestUrl, stream, additionalHeaders); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Gets a typed object from an endpoint | ||||
|      * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise | ||||
|      */ | ||||
|     getJson(requestUrl, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.get(requestUrl, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     postJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.post(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     putJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.put(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     patchJson(requestUrl, obj, additionalHeaders = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const data = JSON.stringify(obj, null, 2); | ||||
|             additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); | ||||
|             additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); | ||||
|             const res = yield this.patch(requestUrl, data, additionalHeaders); | ||||
|             return this._processResponse(res, this.requestOptions); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Makes a raw http request. | ||||
|      * All other methods such as get, post, patch, and request ultimately call this. | ||||
|      * Prefer get, del, post and patch | ||||
|      */ | ||||
|     request(verb, requestUrl, data, headers) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             if (this._disposed) { | ||||
|                 throw new Error('Client has already been disposed.'); | ||||
|             } | ||||
|             const parsedUrl = new URL(requestUrl); | ||||
|             let info = this._prepareRequest(verb, parsedUrl, headers); | ||||
|             // Only perform retries on reads since writes may not be idempotent.
 | ||||
|             const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) | ||||
|                 ? this._maxRetries + 1 | ||||
|                 : 1; | ||||
|             let numTries = 0; | ||||
|             let response; | ||||
|             do { | ||||
|                 response = yield this.requestRaw(info, data); | ||||
|                 // Check if it's an authentication challenge
 | ||||
|                 if (response && | ||||
|                     response.message && | ||||
|                     response.message.statusCode === HttpCodes.Unauthorized) { | ||||
|                     let authenticationHandler; | ||||
|                     for (const handler of this.handlers) { | ||||
|                         if (handler.canHandleAuthentication(response)) { | ||||
|                             authenticationHandler = handler; | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                     if (authenticationHandler) { | ||||
|                         return authenticationHandler.handleAuthentication(this, info, data); | ||||
|                     } | ||||
|                     else { | ||||
|                         // We have received an unauthorized response but have no handlers to handle it.
 | ||||
|                         // Let the response return to the caller.
 | ||||
|                         return response; | ||||
|                     } | ||||
|                 } | ||||
|                 let redirectsRemaining = this._maxRedirects; | ||||
|                 while (response.message.statusCode && | ||||
|                     HttpRedirectCodes.includes(response.message.statusCode) && | ||||
|                     this._allowRedirects && | ||||
|                     redirectsRemaining > 0) { | ||||
|                     const redirectUrl = response.message.headers['location']; | ||||
|                     if (!redirectUrl) { | ||||
|                         // if there's no location to redirect to, we won't
 | ||||
|                         break; | ||||
|                     } | ||||
|                     const parsedRedirectUrl = new URL(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.'); | ||||
|                     } | ||||
|                     // we need to finish reading the response before reassigning response
 | ||||
|                     // which will leak the open socket.
 | ||||
|                     yield response.readBody(); | ||||
|                     // strip authorization header if redirected to a different hostname
 | ||||
|                     if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { | ||||
|                         for (const 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 = yield this.requestRaw(info, data); | ||||
|                     redirectsRemaining--; | ||||
|                 } | ||||
|                 if (!response.message.statusCode || | ||||
|                     !HttpResponseRetryCodes.includes(response.message.statusCode)) { | ||||
|                     // If not a retry code, return immediately instead of retrying
 | ||||
|                     return response; | ||||
|                 } | ||||
|                 numTries += 1; | ||||
|                 if (numTries < maxTries) { | ||||
|                     yield response.readBody(); | ||||
|                     yield this._performExponentialBackoff(numTries); | ||||
|                 } | ||||
|             } while (numTries < maxTries); | ||||
|             return response; | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Needs to be called if keepAlive is set to true in request options. | ||||
|      */ | ||||
|     dispose() { | ||||
|         if (this._agent) { | ||||
|             this._agent.destroy(); | ||||
|         } | ||||
|         this._disposed = true; | ||||
|     } | ||||
|     /** | ||||
|      * Raw request. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      */ | ||||
|     requestRaw(info, data) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve, reject) => { | ||||
|                 function callbackForResult(err, res) { | ||||
|                     if (err) { | ||||
|                         reject(err); | ||||
|                     } | ||||
|                     else if (!res) { | ||||
|                         // If `err` is not passed, then `res` must be passed.
 | ||||
|                         reject(new Error('Unknown error')); | ||||
|                     } | ||||
|                     else { | ||||
|                         resolve(res); | ||||
|                     } | ||||
|                 } | ||||
|                 this.requestRawWithCallback(info, data, callbackForResult); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
|     /** | ||||
|      * Raw request with callback. | ||||
|      * @param info | ||||
|      * @param data | ||||
|      * @param onResult | ||||
|      */ | ||||
|     requestRawWithCallback(info, data, onResult) { | ||||
|         if (typeof data === 'string') { | ||||
|             if (!info.options.headers) { | ||||
|                 info.options.headers = {}; | ||||
|             } | ||||
|             info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); | ||||
|         } | ||||
|         let callbackCalled = false; | ||||
|         function handleResult(err, res) { | ||||
|             if (!callbackCalled) { | ||||
|                 callbackCalled = true; | ||||
|                 onResult(err, res); | ||||
|             } | ||||
|         } | ||||
|         const req = info.httpModule.request(info.options, (msg) => { | ||||
|             const res = new HttpClientResponse(msg); | ||||
|             handleResult(undefined, res); | ||||
|         }); | ||||
|         let socket; | ||||
|         req.on('socket', sock => { | ||||
|             socket = sock; | ||||
|         }); | ||||
|         // If we ever get disconnected, we want the socket to timeout eventually
 | ||||
|         req.setTimeout(this._socketTimeout || 3 * 60000, () => { | ||||
|             if (socket) { | ||||
|                 socket.end(); | ||||
|             } | ||||
|             handleResult(new Error(`Request timeout: ${info.options.path}`)); | ||||
|         }); | ||||
|         req.on('error', function (err) { | ||||
|             // err has statusCode property
 | ||||
|             // res should have headers
 | ||||
|             handleResult(err); | ||||
|         }); | ||||
|         if (data && typeof data === 'string') { | ||||
|             req.write(data, 'utf8'); | ||||
|         } | ||||
|         if (data && typeof data !== 'string') { | ||||
|             data.on('close', function () { | ||||
|                 req.end(); | ||||
|             }); | ||||
|             data.pipe(req); | ||||
|         } | ||||
|         else { | ||||
|             req.end(); | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * Gets an http agent. This function is useful when you need an http agent that handles | ||||
|      * routing through a proxy server - depending upon the url and proxy environment variables. | ||||
|      * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | ||||
|      */ | ||||
|     getAgent(serverUrl) { | ||||
|         const parsedUrl = new URL(serverUrl); | ||||
|         return this._getAgent(parsedUrl); | ||||
|     } | ||||
|     _prepareRequest(method, requestUrl, headers) { | ||||
|         const info = {}; | ||||
|         info.parsedUrl = requestUrl; | ||||
|         const usingSsl = info.parsedUrl.protocol === 'https:'; | ||||
|         info.httpModule = usingSsl ? https : http; | ||||
|         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.method = method; | ||||
|         info.options.headers = this._mergeHeaders(headers); | ||||
|         if (this.userAgent != null) { | ||||
|             info.options.headers['user-agent'] = this.userAgent; | ||||
|         } | ||||
|         info.options.agent = this._getAgent(info.parsedUrl); | ||||
|         // gives handlers an opportunity to participate
 | ||||
|         if (this.handlers) { | ||||
|             for (const handler of this.handlers) { | ||||
|                 handler.prepareRequest(info.options); | ||||
|             } | ||||
|         } | ||||
|         return info; | ||||
|     } | ||||
|     _mergeHeaders(headers) { | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); | ||||
|         } | ||||
|         return lowercaseKeys(headers || {}); | ||||
|     } | ||||
|     _getExistingOrDefaultHeader(additionalHeaders, header, _default) { | ||||
|         let clientHeader; | ||||
|         if (this.requestOptions && this.requestOptions.headers) { | ||||
|             clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; | ||||
|         } | ||||
|         return additionalHeaders[header] || clientHeader || _default; | ||||
|     } | ||||
|     _getAgent(parsedUrl) { | ||||
|         let agent; | ||||
|         const proxyUrl = pm.getProxyUrl(parsedUrl); | ||||
|         const useProxy = proxyUrl && proxyUrl.hostname; | ||||
|         if (this._keepAlive && useProxy) { | ||||
|             agent = this._proxyAgent; | ||||
|         } | ||||
|         if (this._keepAlive && !useProxy) { | ||||
|             agent = this._agent; | ||||
|         } | ||||
|         // if agent is already assigned use that agent.
 | ||||
|         if (agent) { | ||||
|             return agent; | ||||
|         } | ||||
|         const usingSsl = parsedUrl.protocol === 'https:'; | ||||
|         let maxSockets = 100; | ||||
|         if (this.requestOptions) { | ||||
|             maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; | ||||
|         } | ||||
|         // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.
 | ||||
|         if (proxyUrl && proxyUrl.hostname) { | ||||
|             const agentOptions = { | ||||
|                 maxSockets, | ||||
|                 keepAlive: this._keepAlive, | ||||
|                 proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { | ||||
|                     proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` | ||||
|                 })), { host: proxyUrl.hostname, port: proxyUrl.port }) | ||||
|             }; | ||||
|             let tunnelAgent; | ||||
|             const overHttps = proxyUrl.protocol === 'https:'; | ||||
|             if (usingSsl) { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; | ||||
|             } | ||||
|             else { | ||||
|                 tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; | ||||
|             } | ||||
|             agent = tunnelAgent(agentOptions); | ||||
|             this._proxyAgent = agent; | ||||
|         } | ||||
|         // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | ||||
|         if (this._keepAlive && !agent) { | ||||
|             const options = { keepAlive: this._keepAlive, maxSockets }; | ||||
|             agent = usingSsl ? new https.Agent(options) : new http.Agent(options); | ||||
|             this._agent = agent; | ||||
|         } | ||||
|         // if not using private agent and tunnel agent isn't setup then use global agent
 | ||||
|         if (!agent) { | ||||
|             agent = usingSsl ? https.globalAgent : http.globalAgent; | ||||
|         } | ||||
|         if (usingSsl && this._ignoreSslError) { | ||||
|             // 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 | ||||
|             }); | ||||
|         } | ||||
|         return agent; | ||||
|     } | ||||
|     _performExponentialBackoff(retryNumber) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); | ||||
|             const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); | ||||
|             return new Promise(resolve => setTimeout(() => resolve(), ms)); | ||||
|         }); | ||||
|     } | ||||
|     _processResponse(res, options) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { | ||||
|                 const statusCode = res.message.statusCode || 0; | ||||
|                 const response = { | ||||
|                     statusCode, | ||||
|                     result: null, | ||||
|                     headers: {} | ||||
|                 }; | ||||
|                 // not found leads to null obj returned
 | ||||
|                 if (statusCode === HttpCodes.NotFound) { | ||||
|                     resolve(response); | ||||
|                 } | ||||
|                 // get the result from the body
 | ||||
|                 function dateTimeDeserializer(key, value) { | ||||
|                     if (typeof value === 'string') { | ||||
|                         const a = new Date(value); | ||||
|                         if (!isNaN(a.valueOf())) { | ||||
|                             return a; | ||||
|                         } | ||||
|                     } | ||||
|                     return value; | ||||
|                 } | ||||
|                 let obj; | ||||
|                 let contents; | ||||
|                 try { | ||||
|                     contents = yield res.readBody(); | ||||
|                     if (contents && contents.length > 0) { | ||||
|                         if (options && options.deserializeDates) { | ||||
|                             obj = JSON.parse(contents, dateTimeDeserializer); | ||||
|                         } | ||||
|                         else { | ||||
|                             obj = JSON.parse(contents); | ||||
|                         } | ||||
|                         response.result = obj; | ||||
|                     } | ||||
|                     response.headers = res.message.headers; | ||||
|                 } | ||||
|                 catch (err) { | ||||
|                     // Invalid resource (contents not json);  leaving result obj null
 | ||||
|                 } | ||||
|                 // note that 3xx redirects are handled by the http layer.
 | ||||
|                 if (statusCode > 299) { | ||||
|                     let msg; | ||||
|                     // if exception/error in body, attempt to get better error
 | ||||
|                     if (obj && obj.message) { | ||||
|                         msg = obj.message; | ||||
|                     } | ||||
|                     else if (contents && contents.length > 0) { | ||||
|                         // it may be the case that the exception is in the body message as string
 | ||||
|                         msg = contents; | ||||
|                     } | ||||
|                     else { | ||||
|                         msg = `Failed request: (${statusCode})`; | ||||
|                     } | ||||
|                     const err = new HttpClientError(msg, statusCode); | ||||
|                     err.result = response.result; | ||||
|                     reject(err); | ||||
|                 } | ||||
|                 else { | ||||
|                     resolve(response); | ||||
|                 } | ||||
|             })); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| exports.HttpClient = HttpClient; | ||||
| const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); | ||||
| //# sourceMappingURL=index.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 4977: | ||||
| /***/ ((__unused_webpack_module, exports) => { | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| Object.defineProperty(exports, "__esModule", ({ value: true })); | ||||
| exports.checkBypass = exports.getProxyUrl = void 0; | ||||
| function getProxyUrl(reqUrl) { | ||||
|     const usingSsl = reqUrl.protocol === 'https:'; | ||||
|     if (checkBypass(reqUrl)) { | ||||
|         return undefined; | ||||
|     } | ||||
|     const proxyVar = (() => { | ||||
|         if (usingSsl) { | ||||
|             return process.env['https_proxy'] || process.env['HTTPS_PROXY']; | ||||
|         } | ||||
|         else { | ||||
|             return process.env['http_proxy'] || process.env['HTTP_PROXY']; | ||||
|         } | ||||
|     })(); | ||||
|     if (proxyVar) { | ||||
|         return new URL(proxyVar); | ||||
|     } | ||||
|     else { | ||||
|         return undefined; | ||||
|     } | ||||
| } | ||||
| exports.getProxyUrl = getProxyUrl; | ||||
| function checkBypass(reqUrl) { | ||||
|     if (!reqUrl.hostname) { | ||||
|         return false; | ||||
|     } | ||||
|     const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; | ||||
|     if (!noProxy) { | ||||
|         return false; | ||||
|     } | ||||
|     // Determine the request port
 | ||||
|     let reqPort; | ||||
|     if (reqUrl.port) { | ||||
|         reqPort = Number(reqUrl.port); | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'http:') { | ||||
|         reqPort = 80; | ||||
|     } | ||||
|     else if (reqUrl.protocol === 'https:') { | ||||
|         reqPort = 443; | ||||
|     } | ||||
|     // Format the request hostname and hostname with port
 | ||||
|     const upperReqHosts = [reqUrl.hostname.toUpperCase()]; | ||||
|     if (typeof reqPort === 'number') { | ||||
|         upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); | ||||
|     } | ||||
|     // Compare request host against noproxy
 | ||||
|     for (const upperNoProxyItem of noProxy | ||||
|         .split(',') | ||||
|         .map(x => x.trim().toUpperCase()) | ||||
|         .filter(x => x)) { | ||||
|         if (upperReqHosts.some(x => x === upperNoProxyItem)) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| exports.checkBypass = checkBypass; | ||||
| //# sourceMappingURL=proxy.js.map
 | ||||
| 
 | ||||
| /***/ }), | ||||
| 
 | ||||
| /***/ 3771: | ||||
| /***/ ((module, exports) => { | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										34
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										34
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -9,7 +9,7 @@ | ||||
|       "version": "4.0.0", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@actions/cache": "^2.0.2", | ||||
|         "@actions/cache": "^3.0.0", | ||||
|         "@actions/core": "^1.7.0", | ||||
|         "@actions/exec": "^1.1.0", | ||||
|         "@actions/glob": "^0.2.0", | ||||
| @ -31,14 +31,14 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-2.0.2.tgz", | ||||
|       "integrity": "sha512-K1DCaW/OtHj5mV7hI7HEXiceX3rM4Nc0iG2hfYsrkEy6GiOeqlCC/LyICrBZIRDM6+vSrS12tg1ORl4hghomBA==", | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.0.0.tgz", | ||||
|       "integrity": "sha512-GL9CT1Fnu+pqs8TTB621q8Xa8Cilw2n9MwvbgMedetH7L1q2n6jY61gzbwGbKgtVbp3gVJ12aNMi4osSGXx3KQ==", | ||||
|       "dependencies": { | ||||
|         "@actions/core": "^1.2.6", | ||||
|         "@actions/exec": "^1.0.1", | ||||
|         "@actions/glob": "^0.1.0", | ||||
|         "@actions/http-client": "^1.0.9", | ||||
|         "@actions/http-client": "^2.0.1", | ||||
|         "@actions/io": "^1.0.1", | ||||
|         "@azure/ms-rest-js": "^2.6.0", | ||||
|         "@azure/storage-blob": "^12.8.0", | ||||
| @ -55,6 +55,14 @@ | ||||
|         "minimatch": "^3.0.4" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache/node_modules/@actions/http-client": { | ||||
|       "version": "2.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", | ||||
|       "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", | ||||
|       "dependencies": { | ||||
|         "tunnel": "^0.0.6" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache/node_modules/semver": { | ||||
|       "version": "6.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", | ||||
| @ -11332,14 +11340,14 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@actions/cache": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-2.0.2.tgz", | ||||
|       "integrity": "sha512-K1DCaW/OtHj5mV7hI7HEXiceX3rM4Nc0iG2hfYsrkEy6GiOeqlCC/LyICrBZIRDM6+vSrS12tg1ORl4hghomBA==", | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.0.0.tgz", | ||||
|       "integrity": "sha512-GL9CT1Fnu+pqs8TTB621q8Xa8Cilw2n9MwvbgMedetH7L1q2n6jY61gzbwGbKgtVbp3gVJ12aNMi4osSGXx3KQ==", | ||||
|       "requires": { | ||||
|         "@actions/core": "^1.2.6", | ||||
|         "@actions/exec": "^1.0.1", | ||||
|         "@actions/glob": "^0.1.0", | ||||
|         "@actions/http-client": "^1.0.9", | ||||
|         "@actions/http-client": "^2.0.1", | ||||
|         "@actions/io": "^1.0.1", | ||||
|         "@azure/ms-rest-js": "^2.6.0", | ||||
|         "@azure/storage-blob": "^12.8.0", | ||||
| @ -11356,6 +11364,14 @@ | ||||
|             "minimatch": "^3.0.4" | ||||
|           } | ||||
|         }, | ||||
|         "@actions/http-client": { | ||||
|           "version": "2.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", | ||||
|           "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", | ||||
|           "requires": { | ||||
|             "tunnel": "^0.0.6" | ||||
|           } | ||||
|         }, | ||||
|         "semver": { | ||||
|           "version": "6.3.0", | ||||
|           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
|     "format": "prettier --write \"{,!(node_modules)/**/}*.ts\"", | ||||
|     "format-check": "prettier --check \"{,!(node_modules)/**/}*.ts\"", | ||||
|     "release": "ncc build -o dist/setup src/setup-python.ts && ncc build -o dist/cache-save src/cache-save.ts && git add -f dist/", | ||||
|     "test": "jest" | ||||
|     "test": "jest --coverage" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
| @ -23,7 +23,7 @@ | ||||
|   "author": "GitHub", | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/cache": "^2.0.2", | ||||
|     "@actions/cache": "^3.0.0", | ||||
|     "@actions/core": "^1.7.0", | ||||
|     "@actions/exec": "^1.1.0", | ||||
|     "@actions/glob": "^0.2.0", | ||||
|  | ||||
| @ -43,17 +43,11 @@ async function saveCache(packageManager: string) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     await cache.saveCache(cachePaths, primaryKey); | ||||
|     core.info(`Cache saved with the key: ${primaryKey}`); | ||||
|   } catch (error) { | ||||
|     const err = error as Error; | ||||
|     if (err.name === cache.ReserveCacheError.name) { | ||||
|       core.info(err.message); | ||||
|     } else { | ||||
|       throw error; | ||||
|     } | ||||
|   const cacheId = await cache.saveCache(cachePaths, primaryKey); | ||||
|   if (cacheId == -1) { | ||||
|     return; | ||||
|   } | ||||
|   core.info(`Cache saved with the key: ${primaryKey}`); | ||||
| } | ||||
| 
 | ||||
| function isCacheDirectoryExists(cacheDirectory: string[]) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 IvanZosimov
						IvanZosimov