Skip to content

Commit

Permalink
Allow specifying arbitrary headers when downloading tools to the tool…
Browse files Browse the repository at this point in the history
… cache. (#530)
  • Loading branch information
chrisgavin committed Apr 28, 2021
1 parent 15fef78 commit ff45a53
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 6 deletions.
55 changes: 55 additions & 0 deletions packages/tool-cache/__tests__/tool-cache.test.ts
Expand Up @@ -763,6 +763,61 @@ describe('@actions/tool-cache', function() {
expect(err.toString()).toContain('404')
}
})

it('supports authorization headers', async function() {
nock('http://example.com', {
reqheaders: {
authorization: 'token abc123'
}
})
.get('/some-file-that-needs-authorization')
.reply(200, undefined)

await tc.downloadTool(
'http://example.com/some-file-that-needs-authorization',
undefined,
'token abc123'
)
})

it('supports custom headers', async function() {
nock('http://example.com', {
reqheaders: {
accept: 'application/octet-stream'
}
})
.get('/some-file-that-needs-headers')
.reply(200, undefined)

await tc.downloadTool(
'http://example.com/some-file-that-needs-headers',
undefined,
undefined,
{
accept: 'application/octet-stream'
}
)
})

it('supports authorization and custom headers', async function() {
nock('http://example.com', {
reqheaders: {
accept: 'application/octet-stream',
authorization: 'token abc123'
}
})
.get('/some-file-that-needs-authorization-and-headers')
.reply(200, undefined)

await tc.downloadTool(
'http://example.com/some-file-that-needs-authorization-and-headers',
undefined,
'token abc123',
{
accept: 'application/octet-stream'
}
)
})
})

/**
Expand Down
15 changes: 9 additions & 6 deletions packages/tool-cache/src/tool-cache.ts
Expand Up @@ -32,12 +32,14 @@ const userAgent = 'actions/tool-cache'
* @param url url of tool to download
* @param dest path to download tool
* @param auth authorization header
* @param headers other headers
* @returns path to downloaded tool
*/
export async function downloadTool(
url: string,
dest?: string,
auth?: string
auth?: string,
headers?: IHeaders
): Promise<string> {
dest = dest || path.join(_getTempDirectory(), uuidV4())
await io.mkdirP(path.dirname(dest))
Expand All @@ -56,7 +58,7 @@ export async function downloadTool(
const retryHelper = new RetryHelper(maxAttempts, minSeconds, maxSeconds)
return await retryHelper.execute(
async () => {
return await downloadToolAttempt(url, dest || '', auth)
return await downloadToolAttempt(url, dest || '', auth, headers)
},
(err: Error) => {
if (err instanceof HTTPError && err.httpStatusCode) {
Expand All @@ -79,7 +81,8 @@ export async function downloadTool(
async function downloadToolAttempt(
url: string,
dest: string,
auth?: string
auth?: string,
headers?: IHeaders
): Promise<string> {
if (fs.existsSync(dest)) {
throw new Error(`Destination file path ${dest} already exists`)
Expand All @@ -90,12 +93,12 @@ async function downloadToolAttempt(
allowRetries: false
})

let headers: IHeaders | undefined
if (auth) {
core.debug('set auth')
headers = {
authorization: auth
if (headers === undefined) {
headers = {}
}
headers.authorization = auth
}

const response: httpm.HttpClientResponse = await http.get(url, headers)
Expand Down

0 comments on commit ff45a53

Please sign in to comment.