add 'headers' argument to network.get, network.get_binary and network.post

This commit is contained in:
MihailRis 2025-09-08 23:46:37 +03:00
parent cda5bfaf40
commit 9871bf1292
3 changed files with 72 additions and 10 deletions

View File

@ -12,7 +12,7 @@ static int l_get(lua::State* L, network::Network& network) {
auto onResponse = lua::create_lambda_nothrow(L); auto onResponse = lua::create_lambda_nothrow(L);
network::OnReject onReject = nullptr; network::OnReject onReject = nullptr;
if (lua::gettop(L) >= 3) { if (!lua::isnoneornil(L, 3)) {
lua::pushvalue(L, 3); lua::pushvalue(L, 3);
auto callback = lua::create_lambda_nothrow(L); auto callback = lua::create_lambda_nothrow(L);
onReject = [callback](int code) { onReject = [callback](int code) {
@ -20,11 +20,22 @@ static int l_get(lua::State* L, network::Network& network) {
}; };
} }
std::vector<std::string> headers;
if (lua::istable(L, 4)) {
int len = lua::objlen(L, 4);
for (int i = 1; i <= len; i++) {
lua::rawgeti(L, i, 4);
headers.push_back(lua::tostring(L, -1));
lua::pop(L);
}
}
network.get(url, [onResponse](std::vector<char> bytes) { network.get(url, [onResponse](std::vector<char> bytes) {
engine->postRunnable([=]() { engine->postRunnable([=]() {
onResponse({std::string(bytes.data(), bytes.size())}); onResponse({std::string(bytes.data(), bytes.size())});
}); });
}, std::move(onReject)); }, std::move(onReject), std::move(headers));
return 0; return 0;
} }
@ -35,7 +46,7 @@ static int l_get_binary(lua::State* L, network::Network& network) {
auto onResponse = lua::create_lambda_nothrow(L); auto onResponse = lua::create_lambda_nothrow(L);
network::OnReject onReject = nullptr; network::OnReject onReject = nullptr;
if (lua::gettop(L) >= 3) { if (!lua::isnoneornil(L, 3)) {
lua::pushvalue(L, 3); lua::pushvalue(L, 3);
auto callback = lua::create_lambda_nothrow(L); auto callback = lua::create_lambda_nothrow(L);
onReject = [callback](int code) { onReject = [callback](int code) {
@ -43,6 +54,17 @@ static int l_get_binary(lua::State* L, network::Network& network) {
}; };
} }
std::vector<std::string> headers;
if (lua::istable(L, 4)) {
int len = lua::objlen(L, 4);
for (int i = 1; i <= len; i++) {
lua::rawgeti(L, i, 4);
headers.push_back(lua::tostring(L, -1));
lua::pop(L);
}
}
network.get(url, [onResponse](std::vector<char> bytes) { network.get(url, [onResponse](std::vector<char> bytes) {
auto buffer = std::make_shared<util::Buffer<ubyte>>( auto buffer = std::make_shared<util::Buffer<ubyte>>(
reinterpret_cast<const ubyte*>(bytes.data()), bytes.size() reinterpret_cast<const ubyte*>(bytes.data()), bytes.size()
@ -50,7 +72,8 @@ static int l_get_binary(lua::State* L, network::Network& network) {
engine->postRunnable([=]() { engine->postRunnable([=]() {
onResponse({buffer}); onResponse({buffer});
}); });
}, std::move(onReject)); }, std::move(onReject), std::move(headers));
return 0; return 0;
} }
@ -62,7 +85,7 @@ static int l_post(lua::State* L, network::Network& network) {
auto onResponse = lua::create_lambda_nothrow(L); auto onResponse = lua::create_lambda_nothrow(L);
network::OnReject onReject = nullptr; network::OnReject onReject = nullptr;
if (lua::gettop(L) >= 4) { if (!lua::isnoneornil(L, 4)) {
lua::pushvalue(L, 4); lua::pushvalue(L, 4);
auto callback = lua::create_lambda_nothrow(L); auto callback = lua::create_lambda_nothrow(L);
onReject = [callback](int code) { onReject = [callback](int code) {
@ -77,6 +100,16 @@ static int l_post(lua::State* L, network::Network& network) {
string = json::stringify(data, false); string = json::stringify(data, false);
} }
std::vector<std::string> headers;
if (lua::istable(L, 5)) {
int len = lua::objlen(L, 5);
for (int i = 1; i <= len; i++) {
lua::rawgeti(L, i, 5);
headers.push_back(lua::tostring(L, -1));
lua::pop(L);
}
}
engine->getNetwork().post(url, string, [onResponse](std::vector<char> bytes) { engine->getNetwork().post(url, string, [onResponse](std::vector<char> bytes) {
auto buffer = std::make_shared<util::Buffer<ubyte>>( auto buffer = std::make_shared<util::Buffer<ubyte>>(
reinterpret_cast<const ubyte*>(bytes.data()), bytes.size() reinterpret_cast<const ubyte*>(bytes.data()), bytes.size()
@ -84,7 +117,7 @@ static int l_post(lua::State* L, network::Network& network) {
engine->postRunnable([=]() { engine->postRunnable([=]() {
onResponse({std::string(bytes.data(), bytes.size())}); onResponse({std::string(bytes.data(), bytes.size())});
}); });
}, std::move(onReject)); }, std::move(onReject), std::move(headers));
return 0; return 0;
} }

View File

@ -57,6 +57,7 @@ struct Request {
long maxSize; long maxSize;
bool followLocation = false; bool followLocation = false;
std::string data; std::string data;
std::vector<std::string> headers;
}; };
class CurlRequests : public Requests { class CurlRequests : public Requests {
@ -86,10 +87,18 @@ public:
const std::string& url, const std::string& url,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject, OnReject onReject,
std::vector<std::string> headers,
long maxSize long maxSize
) override { ) override {
Request request { Request request {
RequestType::GET, url, onResponse, onReject, maxSize, false, ""}; RequestType::GET,
url,
onResponse,
onReject,
maxSize,
false,
"",
std::move(headers)};
processRequest(std::move(request)); processRequest(std::move(request));
} }
@ -98,10 +107,18 @@ public:
const std::string& data, const std::string& data,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject=nullptr, OnReject onReject=nullptr,
std::vector<std::string> headers = {},
long maxSize=0 long maxSize=0
) override { ) override {
Request request { Request request {
RequestType::POST, url, onResponse, onReject, maxSize, false, ""}; RequestType::POST,
url,
onResponse,
onReject,
maxSize,
false,
"",
std::move(headers)};
request.data = data; request.data = data;
processRequest(std::move(request)); processRequest(std::move(request));
} }
@ -121,6 +138,10 @@ public:
curl_easy_setopt(curl, CURLOPT_POST, request.type == RequestType::POST); curl_easy_setopt(curl, CURLOPT_POST, request.type == RequestType::POST);
curl_slist* hs = NULL; curl_slist* hs = NULL;
for (const auto& header : request.headers) {
hs = curl_slist_append(hs, header.c_str());
}
switch (request.type) { switch (request.type) {
case RequestType::GET: case RequestType::GET:
@ -817,9 +838,10 @@ void Network::get(
const std::string& url, const std::string& url,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject, OnReject onReject,
std::vector<std::string> headers,
long maxSize long maxSize
) { ) {
requests->get(url, onResponse, onReject, maxSize); requests->get(url, onResponse, onReject, std::move(headers), maxSize);
} }
void Network::post( void Network::post(
@ -827,9 +849,12 @@ void Network::post(
const std::string& fieldsData, const std::string& fieldsData,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject, OnReject onReject,
std::vector<std::string> headers,
long maxSize long maxSize
) { ) {
requests->post(url, fieldsData, onResponse, onReject, maxSize); requests->post(
url, fieldsData, onResponse, onReject, std::move(headers), maxSize
);
} }
Connection* Network::getConnection(u64id_t id) { Connection* Network::getConnection(u64id_t id) {

View File

@ -25,6 +25,7 @@ namespace network {
const std::string& url, const std::string& url,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject=nullptr, OnReject onReject=nullptr,
std::vector<std::string> headers = {},
long maxSize=0 long maxSize=0
) = 0; ) = 0;
@ -33,6 +34,7 @@ namespace network {
const std::string& data, const std::string& data,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject=nullptr, OnReject onReject=nullptr,
std::vector<std::string> headers = {},
long maxSize=0 long maxSize=0
) = 0; ) = 0;
@ -144,6 +146,7 @@ namespace network {
const std::string& url, const std::string& url,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject = nullptr, OnReject onReject = nullptr,
std::vector<std::string> headers = {},
long maxSize=0 long maxSize=0
); );
@ -152,6 +155,7 @@ namespace network {
const std::string& fieldsData, const std::string& fieldsData,
OnResponse onResponse, OnResponse onResponse,
OnReject onReject = nullptr, OnReject onReject = nullptr,
std::vector<std::string> headers = {},
long maxSize=0 long maxSize=0
); );