Разбирать строки прокси в массив объектов

Цель этого модуля — принять строку (пользовательский ввод, кто-то скопирует и вставит большой список прокси-серверов) и проанализировать ее в массив объектов.

Я ценю каждый и все Обратная связь, но я особенно заинтересован в улучшении 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
  }
]

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *