diff --git a/doc/en/scripting/builtins/libnetwork.md b/doc/en/scripting/builtins/libnetwork.md index e4e83048..0d32d849 100644 --- a/doc/en/scripting/builtins/libnetwork.md +++ b/doc/en/scripting/builtins/libnetwork.md @@ -11,9 +11,9 @@ network.get( -- Function to call when response is received callback: function(str), -- Error handler - [optional] onfailure: function(int), + [optional] onfailure: function(int, str), -- List of additional request headers - [optional] headers: table + [optional] headers: table ) -- Example: @@ -24,9 +24,9 @@ end) -- A variant for binary files, with a byte array instead of a string in the response. network.get_binary( url: str, - callback: function(table|ByteArray), - [optional] onfailure: function(int), - [optional] headers: table + callback: function(ByteArray), + [optional] onfailure: function(int, str), + [optional] headers: table ) -- Performs a POST request to the specified URL. @@ -36,13 +36,13 @@ network.get_binary( network.post( url: str, -- Request body as a table (will be converted to JSON) or string - body: table|string, + body: table|str, -- Function called when response is received callback: function(str), -- Error handler - [optional] onfailure: function(int), + [optional] onfailure: function(int, str), -- List of additional request headers - [optional] headers: table + [optional] headers: table ) ``` diff --git a/doc/ru/scripting/builtins/libnetwork.md b/doc/ru/scripting/builtins/libnetwork.md index dc960d5c..c880240c 100644 --- a/doc/ru/scripting/builtins/libnetwork.md +++ b/doc/ru/scripting/builtins/libnetwork.md @@ -11,9 +11,9 @@ network.get( -- Функция, вызываемая при получении ответа callback: function(str), -- Обработчик ошибок - [опционально] onfailure: function(int), + [опционально] onfailure: function(int, str), -- Список дополнительных заголовков запроса - [опционально] headers: table + [опционально] headers: table ) -- Пример: @@ -24,9 +24,9 @@ end) -- Вариант для двоичных файлов, с массивом байт вместо строки в ответе. network.get_binary( url: str, - callback: function(table|ByteArray), - [опционально] onfailure: function(int), - [опционально] headers: table + callback: function(ByteArray), + [опционально] onfailure: function(int, Bytearray), + [опционально] headers: table ) -- Выполняет POST запрос к указанному URL. @@ -36,13 +36,13 @@ network.get_binary( network.post( url: str, -- Тело запроса в виде таблицы, конвертируемой в JSON или строки - body: table|string, + body: table|str, -- Функция, вызываемая при получении ответа callback: function(str), -- Обработчик ошибок - [опционально] onfailure: function(int), + [опционально] onfailure: function(int, str), -- Список дополнительных заголовков запроса - [опционально] headers: table + [опционально] headers: table ) ``` diff --git a/res/scripts/classes.lua b/res/scripts/classes.lua index 5454fbfb..e950aa0d 100644 --- a/res/scripts/classes.lua +++ b/res/scripts/classes.lua @@ -273,7 +273,7 @@ network.__process_events = function() _http_response_callbacks[event[3]] = nil _http_error_callbacks[event[3]] = nil if callback then - callback(event[2]) + callback(event[2], event[4]) end end end diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index c41a32d8..6e548cf9 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -88,27 +88,24 @@ static int perform_get(lua::State* L, network::Network& network, bool binary) { int currentRequestId = request_id++; - network.get(url, [currentRequestId, binary](std::vector bytes) { - push_event(NetworkEvent( - RESPONSE, - ResponseEventDto { - 200, - binary, - currentRequestId, - std::move(bytes) - } - )); - }, [currentRequestId](int code) { - push_event(NetworkEvent( - RESPONSE, - ResponseEventDto { - code, - false, - currentRequestId, - {} - } - )); - }, std::move(headers)); + network.get( + url, + [currentRequestId, binary](std::vector bytes) { + push_event(NetworkEvent( + RESPONSE, + ResponseEventDto { + 200, binary, currentRequestId, std::move(bytes)} + )); + }, + [currentRequestId, binary](int code, std::vector bytes) { + push_event(NetworkEvent( + RESPONSE, + ResponseEventDto { + code, binary, currentRequestId, std::move(bytes)} + )); + }, + std::move(headers) + ); return lua::pushinteger(L, currentRequestId); } @@ -138,21 +135,17 @@ static int l_post(lua::State* L, network::Network& network) { url, string, [currentRequestId](std::vector bytes) { - auto buffer = std::make_shared>( - reinterpret_cast(bytes.data()), bytes.size() - ); push_event(NetworkEvent( RESPONSE, ResponseEventDto { - 200, - false, - currentRequestId, - std::vector(buffer->begin(), buffer->end())} + 200, false, currentRequestId, std::move(bytes)} )); }, - [currentRequestId](int code) { + [currentRequestId](int code, std::vector bytes) { push_event(NetworkEvent( - RESPONSE, ResponseEventDto {code, false, currentRequestId, {}} + RESPONSE, + ResponseEventDto { + code, false, currentRequestId, std::move(bytes)} )); }, std::move(headers) diff --git a/src/network/Network.cpp b/src/network/Network.cpp index b175a809..7d33536c 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -173,7 +173,7 @@ public: auto message = curl_multi_strerror(res); logger.error() << message << " (" << url << ")"; if (onReject) { - onReject(HTTP_BAD_GATEWAY); + onReject(HTTP_BAD_GATEWAY, {}); } url = ""; } @@ -188,7 +188,7 @@ public: auto message = curl_multi_strerror(res); logger.error() << message << " (" << url << ")"; if (onReject) { - onReject(HTTP_BAD_GATEWAY); + onReject(HTTP_BAD_GATEWAY, {}); } curl_multi_remove_handle(multiHandle, curl); url = ""; @@ -213,9 +213,14 @@ public: onResponse(std::move(buffer)); } } else { - logger.error() << "response code " << response << " (" << url << ")"; + logger.error() + << "response code " << response << " (" << url << ")" + << (buffer.empty() + ? "" + : std::to_string(buffer.size()) + " byte(s)"); + totalDownload += buffer.size(); if (onReject) { - onReject(response); + onReject(response, std::move(buffer)); } } url = ""; diff --git a/src/network/Network.hpp b/src/network/Network.hpp index 41ebbe13..054b9444 100644 --- a/src/network/Network.hpp +++ b/src/network/Network.hpp @@ -11,7 +11,7 @@ namespace network { using OnResponse = std::function)>; - using OnReject = std::function; + using OnReject = std::function)>; using ConnectCallback = std::function; using ServerDatagramCallback = std::function; using ClientDatagramCallback = std::function; diff --git a/test/network/curltest.cpp b/test/network/curltest.cpp index e365651e..42806c77 100644 --- a/test/network/curltest.cpp +++ b/test/network/curltest.cpp @@ -16,7 +16,7 @@ TEST(curltest, curltest) { auto view = std::string_view(data.data(), data.size()); auto value = json::parse(view); std::cout << value << std::endl; - }, [](auto){} + }, [](auto, auto){} ); std::cout << "upload: " << network->getTotalUpload() << " B" << std::endl; std::cout << "download: " << network->getTotalDownload() << " B" << std::endl;