Цель этого модуля — принять строку (пользовательский ввод, кто-то скопирует и вставит большой список прокси-серверов) и проанализировать ее в массив объектов.
Я ценю каждый и все Обратная связь, но я особенно заинтересован в улучшении stringToProxy
функция.
А именно, я не уверен в изменении строкового параметра, похоже, может быть лучшее решение. И то, как я объявляю прокси в начале функции, мне кажется неправильным (используя As
) но я не мог придумать лучшего решения. Я также чувствую, что злоупотребляю string.split()
.
Спасибо за ваше время!
Редактировать:
Включил url
модуль, как рекомендовал Назар. Я доволен этим решением, но все еще принимаю отзывы.
const { URL } = require("url");
interface Proxy {
host: string;
port: number;
protocol: string;
auth?: {
username: string;
password: string;
};
}
function parse(string: string): Proxy[] {
const rawArray = stringToArray(string);
const fixedArray = rawArray.map((string) => fixProxyString(string));
const proxyArray = fixedArray.map((string) => stringToProxy(string));
return proxyArray;
}
function stringToArray(string: string): string[] {
return string.trim().replace(/[ ,n]+/g, ",").split(",");
}
function fixProxyString(string: string): string {
return string.includes("://") ? string : `http://${string}`; //if user doesnt specify a protocol, default to http
}
function stringToProxy(string: string): Proxy {
const url = new URL(string);
return {
host: url.hostname,
port: url.port ? parseInt(url.port) : 80, //if proxy is 80 url will ignore it so i need to explicitly add it
protocol: url.protocol.slice(0, -1), //removing the colon
auth: url.username ? { username: url.username, password: url.password } : undefined
};
}
export = parse;
Перед редактированием:
interface Proxy {
host: string;
port: number;
auth?: {
username: string;
password: string;
};
protocol?: string;
}
function parse(string: string): Proxy[] {
const rawArray = stringToArray(string);
const proxyArray = rawArray.map((string) => stringToProxy(string));
return proxyArray;
}
function stringToArray(string: string): string[] {
return string.trim().replace(/[ ,n]+/g, ",").split(",");
}
function stringToProxy(string: string) {
const proxy = {} as Proxy;
if (string.includes("://")) {
const [protocol, remainder] = string.split("://");
proxy.protocol = protocol;
string = remainder;
}
if (string.includes("@")) {
const [auth, remainder] = string.split("@");
const [username, password] = auth.split(":");
proxy.auth = { username, password };
string = remainder;
}
const [host, port] = string.split(":");
proxy.port = parseInt(port);
proxy.host = host;
return proxy;
}
export = parse;
Применение:
const parse = require("parse-proxy");
parse(`1.1.1.1:80, 2.2.2.2:80, 3.3.3.3:80`)
//result
[
{ host: '1.1.1.1', port: 80 },
{ host: '2.2.2.2', port: 80 },
{ host: '3.3.3.3', port: 80 }
]
parse(`https://user:pass@104.236.55.48:8080nhttps://user:pass@213.105.29.14:3128`)
//result
[
{
protocol: 'https',
auth: { username: 'user', password: 'pass' },
host: '104.236.55.48',
port: 8080
},
{
protocol: 'https',
auth: { username: 'user', password: 'pass' },
host: '213.105.29.14',
port: 3128
}
]