From 860d7708e9766cb38c5dbd15508f145a89b4df9e Mon Sep 17 00:00:00 2001 From: boa604 Date: Fri, 24 Apr 2026 15:01:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=20=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=BA=D0=BE=D0=B2,=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BD=D0=B5=D0=BB=D1=8C=D0=B7=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD=D1=8F=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/http_client.js | 49 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/core/http_client.js b/core/http_client.js index 9dda490..5a721e0 100644 --- a/core/http_client.js +++ b/core/http_client.js @@ -18,8 +18,22 @@ const { Socket } = require("net"); //Встроенная поддержка с //Таймаут по умолчанию const DEFAULT_TIMEOUT = 30000; + +//Считывание всех Set-Cookie из fetch-ответа +const getFetchSetCookieValues = responseHeaders => { + if (typeof responseHeaders.getSetCookie === "function") { + return responseHeaders.getSetCookie(); + } + return []; +}; + //Заголовки, которые нельзя объединять -const NON_COMBINABLE_HEADERS = new Set(["set-cookie"]); +const NON_COMBINABLE_HEADERS = [ + { + headerName: "set-cookie", + getValues: getFetchSetCookieValues + } +]; //Ошибка HTTP-запроса class HttpError extends Error { @@ -181,6 +195,19 @@ const applyHeaderValues = (headers, rawHeaders, headerName, values) => { } }; +//Применение правил обработки некомбинируемых заголовков fetch-ответа +const applyNonCombinableFetchHeaders = (headers, rawHeaders, responseHeaders) => { + for (const rule of NON_COMBINABLE_HEADERS) { + if (!rule || typeof rule !== "object") continue; + const headerName = String(rule.headerName || "") + .trim() + .toLowerCase(); + if (!headerName || typeof rule.getValues !== "function") continue; + const values = rule.getValues(responseHeaders); + applyHeaderValues(headers, rawHeaders, headerName, values); + } +}; + //Формирование заголовков из массива rawHeaders/rawTrailers const buildHeadersFromRawPairs = rawPairs => { const headers = {}; @@ -210,10 +237,7 @@ const buildHeadersFromFetchHeaders = responseHeaders => { rawHeaders.push(name, value); } //Обработка некомбинируемых заголовков - if (NON_COMBINABLE_HEADERS.has("set-cookie") && typeof responseHeaders.getSetCookie === "function") { - const setCookieValues = responseHeaders.getSetCookie(); - applyHeaderValues(headers, rawHeaders, "set-cookie", setCookieValues); - } + applyNonCombinableFetchHeaders(headers, rawHeaders, responseHeaders); return { headers, rawHeaders @@ -266,13 +290,14 @@ const processResponse = (result, options) => { //Формируем результат в зависимости от "resolveWithFullResponse" (это параметр из "Request": true - отвечать с заголовком, false - отвечать сразу телом) if (options.resolveWithFullResponse) { //Просили ответить полным ответом - const fullResponse = { ...result }; - fullResponse.statusCode = result.statusCode; - fullResponse.statusMessage = result.statusMessage || ""; - fullResponse.headers = result.headers; - fullResponse.body = processedBody; - fullResponse.url = result.url; - return fullResponse; + return { + ...result, + statusCode: result.statusCode, + statusMessage: result.statusMessage || "", + headers: result.headers, + body: processedBody, + url: result.url + }; } else { //Просили только тело return processedBody;