Compare commits

..

6 Commits

Author SHA1 Message Date
Tatyana Kostromskaya 904b21412d . 2023-10-05 16:10:23 +02:00
Tatyana Kostromskaya 844682e182 . 2023-10-04 15:45:37 +00:00
Tatyana Kostromskaya f699b96ecf . 2023-10-04 15:33:15 +00:00
Tatyana Kostromskaya 774f139bef . 2023-10-04 14:56:21 +00:00
Tatyana Kostromskaya 5a395b732b . 2023-10-04 12:27:24 +00:00
Tatyana Kostromskaya 89e7efa45d . 2023-10-04 09:50:55 +00:00
12 changed files with 551 additions and 364 deletions
@@ -1,6 +1,7 @@
import * as http from 'http'
import * as https from 'https'
import proxy from 'proxy'
import { ProxyServer, createProxy } from "proxy";
import { ProxyAgent, fetch as undiciFetch } from "undici";
// Default values are set when the module is imported, so we need to set proxy first.
const proxyUrl = 'http://127.0.0.1:8081'
@@ -16,7 +17,7 @@ describe('@actions/github', () => {
beforeAll(async () => {
// Start proxy server
proxyServer = proxy()
proxyServer = createProxy()
await new Promise<void>(resolve => {
const port = Number(proxyUrl.split(':')[2])
proxyServer.listen(port, () => resolve())
+2 -2
View File
@@ -1,5 +1,5 @@
import * as http from 'http'
import proxy from 'proxy'
import { createProxy } from 'proxy'
import {getOctokit} from '../src/github'
import {GitHub, getOctokitOptions} from '../src/utils'
@@ -12,7 +12,7 @@ describe('@actions/github', () => {
beforeAll(async () => {
// Start proxy server
proxyServer = proxy()
proxyServer = createProxy()
await new Promise<void>(resolve => {
const port = Number(proxyUrl.split(':')[2])
proxyServer.listen(port, () => resolve())
+418 -312
View File
File diff suppressed because it is too large Load Diff
+9 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@actions/github",
"version": "5.1.1",
"version": "6.0.2",
"description": "Actions github lib",
"keywords": [
"github",
@@ -38,12 +38,14 @@
"url": "https://github.com/actions/toolkit/issues"
},
"dependencies": {
"@actions/http-client": "^2.0.1",
"@octokit/core": "^3.6.0",
"@octokit/plugin-paginate-rest": "^2.17.0",
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
"@actions/http-client": "file:actions-http-client-3.0.3.tgz",
"@octokit/core": "^4.2.4",
"@octokit/plugin-paginate-rest": "^6.1.2",
"@octokit/plugin-rest-endpoint-methods": "^7.2.3",
"undici": "^5.25.2"
},
"devDependencies": {
"proxy": "^1.0.2"
"@types/proxy": "^1.0.1",
"proxy": "^2.1.1"
}
}
}
+17
View File
@@ -1,6 +1,7 @@
import * as http from 'http'
import * as httpClient from '@actions/http-client'
import {OctokitOptions} from '@octokit/core/dist-types/types'
import { ProxyAgent, Agent, fetch as undiciFetch } from "undici";
export function getAuthString(
token: string,
@@ -20,6 +21,22 @@ export function getProxyAgent(destinationUrl: string): http.Agent {
return hc.getAgent(destinationUrl)
}
export function getProxyAgentDispatcher(destinationUrl: string): ProxyAgent | undefined {
const hc = new httpClient.HttpClient()
return hc.getAgentDispatcher(destinationUrl)
}
export function getProxyFetch(destinationUrl): any {
const httpAgent = getProxyAgentDispatcher(destinationUrl)
const proxyFetch: typeof undiciFetch = (url, opts) => {
return undiciFetch(url, {
...opts,
dispatcher: httpAgent,
});
};
return proxyFetch;
}
export function getApiBaseUrl(): string {
return process.env['GITHUB_API_URL'] || 'https://api.github.com'
}
+2 -1
View File
@@ -13,7 +13,8 @@ const baseUrl = Utils.getApiBaseUrl()
export const defaults: OctokitOptions = {
baseUrl,
request: {
agent: Utils.getProxyAgent(baseUrl)
agent: Utils.getProxyAgent(baseUrl),
fetch: Utils.getProxyFetch(baseUrl)
}
}
+10 -2
View File
@@ -3,7 +3,7 @@
import * as http from 'http'
import * as httpm from '../lib/'
import * as pm from '../lib/proxy'
import {ProxyAgent} from 'undici'
import { ProxyAgent, Agent, fetch as undiciFetch } from "undici";
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
const proxy = require('proxy')
@@ -296,7 +296,7 @@ describe('proxy', () => {
expect(agent.proxyOptions.proxyAuth).toBe('user:password')
})
it('ProxyAgent is returned when proxy setting are provided', async () => {
it('proxy settings return ProxyAgent', async () => {
process.env['https_proxy'] = 'http://127.0.0.1:8080'
const httpClient = new httpm.HttpClient()
const agent = httpClient.getAgentDispatcher('https://some-url')
@@ -304,6 +304,14 @@ describe('proxy', () => {
console.log(agent)
expect(agent instanceof ProxyAgent).toBe(true)
})
// it('proxyAuth is set in tunnel agent when authentication is provided', async () => {
// const httpClient = new httpm.HttpClient()
// const agent: Agent | ProxyAgent = httpClient.getAgentDispatcher('https://some-url')
// // eslint-disable-next-line no-console
// console.log(agent)
// expect(agent instanceof Agent).toBe(true)
// })
})
function _clearVars(): void {
Binary file not shown.
+10 -6
View File
@@ -1,28 +1,29 @@
{
"name": "@actions/http-client",
"version": "2.2.0",
"version": "3.0.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@actions/http-client",
"version": "2.2.0",
"version": "3.0.3",
"license": "MIT",
"dependencies": {
"tunnel": "^0.0.6",
"undici": "^5.25.4"
"tunnel": "^0.0.6"
},
"devDependencies": {
"@types/node": "20.7.1",
"@types/proxy": "^1.0.1",
"@types/tunnel": "0.0.3",
"proxy": "^2.1.1"
"proxy": "^2.1.1",
"undici": "^5.25.4"
}
},
"node_modules/@fastify/busboy": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
"dev": true,
"engines": {
"node": ">=14"
}
@@ -219,6 +220,7 @@
"version": "5.25.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.25.4.tgz",
"integrity": "sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==",
"dev": true,
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
@@ -231,7 +233,8 @@
"@fastify/busboy": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ=="
"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
"dev": true
},
"@types/node": {
"version": "20.7.1",
@@ -384,6 +387,7 @@
"version": "5.25.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.25.4.tgz",
"integrity": "sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==",
"dev": true,
"requires": {
"@fastify/busboy": "^2.0.0"
}
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@actions/http-client",
"version": "2.2.0",
"version": "3.0.3",
"description": "Actions Http Client",
"keywords": [
"github",
@@ -42,10 +42,10 @@
"@types/node": "20.7.1",
"@types/tunnel": "0.0.3",
"proxy": "^2.1.1",
"undici": "^5.25.4",
"@types/proxy": "^1.0.1"
},
"dependencies": {
"tunnel": "^0.0.6",
"undici": "^5.25.4"
"tunnel": "^0.0.6"
}
}
+68 -13
View File
@@ -6,7 +6,7 @@ import * as ifm from './interfaces'
import * as net from 'net'
import * as pm from './proxy'
import * as tunnel from 'tunnel'
import {ProxyAgent} from 'undici'
import { ProxyAgent, Agent, fetch as undiciFetch } from "undici";
export enum HttpCodes {
OK = 200,
@@ -138,6 +138,7 @@ export class HttpClient {
private _maxRetries = 1
private _agent: any
private _proxyAgent: any
private _agentDispatcher: any
private _proxyAgentDispatcher: any
private _keepAlive = false
private _disposed = false
@@ -570,11 +571,12 @@ export class HttpClient {
const parsedUrl = new URL(serverUrl)
const proxyUrl = pm.getProxyUrl(parsedUrl)
const useProxy = proxyUrl && proxyUrl.hostname
if (!useProxy) {
return
if (useProxy) {
return this._getProxyAgentDispatcher(parsedUrl, proxyUrl)
}
else {
return;
}
return this._getProxyAgentDispatcher(parsedUrl, proxyUrl)
}
private _prepareRequest(
@@ -716,25 +718,38 @@ export class HttpClient {
private _getProxyAgentDispatcher(parsedUrl: URL, proxyUrl: URL): ProxyAgent {
let proxyAgent
const useProxy = proxyUrl && proxyUrl.hostname
if (this._keepAlive) {
if (this._keepAlive && useProxy) {
proxyAgent = this._proxyAgentDispatcher
}
if (this._keepAlive && !useProxy) {
proxyAgent = this._agentDispatcher
}
// if agent is already assigned use that agent.
if (proxyAgent) {
return proxyAgent
}
const usingSsl = parsedUrl.protocol === 'https:'
proxyAgent = new ProxyAgent({
uri: proxyUrl.href,
pipelining: !this._keepAlive ? 0 : 1,
...((proxyUrl.username || proxyUrl.password) && {
token: `${proxyUrl.username}:${proxyUrl.password}`
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) {
proxyAgent = new ProxyAgent({
uri: proxyUrl.href,
pipelining: (!this._keepAlive ? 0 : 1),
...((proxyUrl.username || proxyUrl.password) && {
token: `${proxyUrl.username}:${proxyUrl.password}`
}),
})
})
this._proxyAgentDispatcher = proxyAgent
this._proxyAgentDispatcher = proxyAgent
}
if (usingSsl && this._ignoreSslError) {
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
@@ -748,6 +763,46 @@ export class HttpClient {
return proxyAgent
}
private _getAgentDispatcher(parsedUrl: URL): Agent {
let agent;
if (this._keepAlive) {
agent = this._agentDispatcher
}
// 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
}
// if reusing agent across request and tunneling agent isn't assigned create a new agent
if (!agent) {
agent = new Agent(
{
pipelining: (!this._keepAlive ? 0 : 1),
}
)
this._agentDispatcher = agent
}
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.connect || {}, {
rejectUnauthorized: false
})
}
return agent
}
private async _performExponentialBackoff(retryNumber: number): Promise<void> {
retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber)
const ms: number = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber)
+9 -16
View File
@@ -93,20 +93,13 @@
}
},
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
"ms": "^2.1.1"
}
},
"node_modules/json-stringify-safe": {
@@ -246,12 +239,12 @@
}
},
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": {
"ms": "2.1.2"
"ms": "^2.1.1"
}
},
"json-stringify-safe": {