mirror of https://github.com/actions/toolkit
Handle Encoded URL for Proxy Username and Password in HTTP Client (#1782)
* uri-decode-fix Signed-off-by: Yu <yu.yang@anz.com> * http-client URLdecode fix Signed-off-by: Yu <yu.yang@anz.com> * http-client URLdecode test typo fix Signed-off-by: Yu <yu.yang@anz.com> --------- Signed-off-by: Yu <yu.yang@anz.com>pull/1794/head
parent
279e891118
commit
1b9927d1c7
|
@ -307,6 +307,18 @@ describe('proxy', () => {
|
||||||
console.log(agent)
|
console.log(agent)
|
||||||
expect(agent instanceof ProxyAgent).toBe(true)
|
expect(agent instanceof ProxyAgent).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('proxyAuth is set in tunnel agent when authentication is provided with URIencoding', async () => {
|
||||||
|
process.env['https_proxy'] =
|
||||||
|
'http://user%40github.com:p%40ssword@127.0.0.1:8080'
|
||||||
|
const httpClient = new httpm.HttpClient()
|
||||||
|
const agent: any = httpClient.getAgent('https://some-url')
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(agent)
|
||||||
|
expect(agent.proxyOptions.host).toBe('127.0.0.1')
|
||||||
|
expect(agent.proxyOptions.port).toBe('8080')
|
||||||
|
expect(agent.proxyOptions.proxyAuth).toBe('user@github.com:p@ssword')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
function _clearVars(): void {
|
function _clearVars(): void {
|
||||||
|
|
|
@ -15,10 +15,10 @@ export function getProxyUrl(reqUrl: URL): URL | undefined {
|
||||||
|
|
||||||
if (proxyVar) {
|
if (proxyVar) {
|
||||||
try {
|
try {
|
||||||
return new URL(proxyVar)
|
return new DecodedURL(proxyVar)
|
||||||
} catch {
|
} catch {
|
||||||
if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))
|
if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))
|
||||||
return new URL(`http://${proxyVar}`)
|
return new DecodedURL(`http://${proxyVar}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return undefined
|
return undefined
|
||||||
|
@ -87,3 +87,22 @@ function isLoopbackAddress(host: string): boolean {
|
||||||
hostLower.startsWith('[0:0:0:0:0:0:0:1]')
|
hostLower.startsWith('[0:0:0:0:0:0:0:1]')
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DecodedURL extends URL {
|
||||||
|
private _decodedUsername: string
|
||||||
|
private _decodedPassword: string
|
||||||
|
|
||||||
|
constructor(url: string | URL, base?: string | URL) {
|
||||||
|
super(url, base)
|
||||||
|
this._decodedUsername = decodeURIComponent(super.username)
|
||||||
|
this._decodedPassword = decodeURIComponent(super.password)
|
||||||
|
}
|
||||||
|
|
||||||
|
get username(): string {
|
||||||
|
return this._decodedUsername
|
||||||
|
}
|
||||||
|
|
||||||
|
get password(): string {
|
||||||
|
return this._decodedPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue