mirror of
https://github.com/shivammathur/setup-php.git
synced 2025-09-07 21:34:08 +07:00
Refactor utils.fetch to a module and mock it with nock
Add redirect support in utils.fetch
This commit is contained in:
54
src/fetch.ts
Normal file
54
src/fetch.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import {IncomingMessage, OutgoingHttpHeaders} from 'http';
|
||||
import * as https from 'https';
|
||||
import * as url from 'url';
|
||||
|
||||
/**
|
||||
* Function to fetch an URL
|
||||
*
|
||||
* @param input_url
|
||||
* @param auth_token
|
||||
*/
|
||||
export async function fetch(
|
||||
input_url: string,
|
||||
auth_token?: string,
|
||||
redirect_count = 5
|
||||
): Promise<Record<string, string>> {
|
||||
const fetch_promise: Promise<Record<string, string>> = new Promise(
|
||||
resolve => {
|
||||
const url_object: url.UrlObject = new url.URL(input_url);
|
||||
const headers: OutgoingHttpHeaders = {
|
||||
'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
|
||||
};
|
||||
if (auth_token) {
|
||||
headers.authorization = 'Bearer ' + auth_token;
|
||||
}
|
||||
const options: https.RequestOptions = {
|
||||
hostname: url_object.hostname,
|
||||
path: url_object.pathname,
|
||||
headers: headers
|
||||
};
|
||||
const req = https.get(options, (res: IncomingMessage) => {
|
||||
if (res.statusCode === 200) {
|
||||
let body = '';
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', chunk => (body += chunk));
|
||||
res.on('end', () => resolve({data: `${body}`}));
|
||||
} else if (
|
||||
[301, 302, 303, 307, 308].includes(res.statusCode as number)
|
||||
) {
|
||||
if (redirect_count > 0 && res.headers.location) {
|
||||
fetch(res.headers.location, auth_token, redirect_count--).then(
|
||||
resolve
|
||||
);
|
||||
} else {
|
||||
resolve({error: `${res.statusCode}: Redirect error`});
|
||||
}
|
||||
} else {
|
||||
resolve({error: `${res.statusCode}: ${res.statusMessage}`});
|
||||
}
|
||||
});
|
||||
req.end();
|
||||
}
|
||||
);
|
||||
return await fetch_promise;
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
import * as utils from './utils';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import * as fetch from './fetch';
|
||||
import * as utils from './utils';
|
||||
|
||||
type RS = Record<string, string>;
|
||||
type RSRS = Record<string, RS>;
|
||||
@ -21,7 +22,7 @@ export async function getSemverVersion(data: RS): Promise<string> {
|
||||
const search: string = data['version_prefix'] + data['version'];
|
||||
const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`;
|
||||
const token: string = await utils.readEnv('COMPOSER_TOKEN');
|
||||
const response: RS = await utils.fetch(url, token);
|
||||
const response: RS = await fetch.fetch(url, token);
|
||||
if (response.error || response.data === '[]') {
|
||||
data['error'] = response.error ?? `No version found with prefix ${search}.`;
|
||||
return data['version'];
|
||||
@ -42,7 +43,7 @@ export async function getLatestVersion(data: RS): Promise<string> {
|
||||
if (!data['version'] && data['fetch_latest'] === 'false') {
|
||||
return 'latest';
|
||||
}
|
||||
const resp: Record<string, string> = await utils.fetch(
|
||||
const resp: Record<string, string> = await fetch.fetch(
|
||||
`${data['github']}/${data['repository']}/releases.atom`
|
||||
);
|
||||
if (resp['data']) {
|
||||
|
46
src/utils.ts
46
src/utils.ts
@ -1,8 +1,6 @@
|
||||
import {IncomingMessage, OutgoingHttpHeaders} from 'http';
|
||||
import * as https from 'https';
|
||||
import * as path from 'path';
|
||||
import * as url from 'url';
|
||||
import * as core from '@actions/core';
|
||||
import * as fetch from './fetch';
|
||||
|
||||
/**
|
||||
* Function to read environment variable and return a string value.
|
||||
@ -46,46 +44,6 @@ export async function getInput(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to fetch an URL
|
||||
*
|
||||
* @param input_url
|
||||
* @param auth_token
|
||||
*/
|
||||
export async function fetch(
|
||||
input_url: string,
|
||||
auth_token?: string
|
||||
): Promise<Record<string, string>> {
|
||||
const fetch_promise: Promise<Record<string, string>> = new Promise(
|
||||
resolve => {
|
||||
const url_object: url.UrlObject = new url.URL(input_url);
|
||||
const headers: OutgoingHttpHeaders = {
|
||||
'User-Agent': `Mozilla/5.0 (${process.platform} ${process.arch}) setup-php`
|
||||
};
|
||||
if (auth_token) {
|
||||
headers.authorization = 'Bearer ' + auth_token;
|
||||
}
|
||||
const options: https.RequestOptions = {
|
||||
hostname: url_object.hostname,
|
||||
path: url_object.pathname,
|
||||
headers: headers
|
||||
};
|
||||
const req = https.get(options, (res: IncomingMessage) => {
|
||||
if (res.statusCode != 200) {
|
||||
resolve({error: `${res.statusCode}: ${res.statusMessage}`});
|
||||
} else {
|
||||
let body = '';
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', chunk => (body += chunk));
|
||||
res.on('end', () => resolve({data: `${body}`}));
|
||||
}
|
||||
});
|
||||
req.end();
|
||||
}
|
||||
);
|
||||
return await fetch_promise;
|
||||
}
|
||||
|
||||
/** Function to get manifest URL
|
||||
*
|
||||
*/
|
||||
@ -102,7 +60,7 @@ export async function parseVersion(version: string): Promise<string> {
|
||||
const manifest = await getManifestURL();
|
||||
switch (true) {
|
||||
case /^(latest|nightly|\d+\.x)$/.test(version):
|
||||
return JSON.parse((await fetch(manifest))['data'])[version];
|
||||
return JSON.parse((await fetch.fetch(manifest))['data'])[version];
|
||||
default:
|
||||
switch (true) {
|
||||
case version.length > 1:
|
||||
|
Reference in New Issue
Block a user