refactor Network

This commit is contained in:
MihailRis 2024-11-23 09:49:17 +03:00
parent 772fafb6ad
commit 5e063d9fe0
4 changed files with 23 additions and 43 deletions

View File

@ -11,7 +11,7 @@ static int l_http_get(lua::State* L) {
lua::pushvalue(L, 2);
auto onResponse = lua::create_lambda(L);
engine->getNetwork().httpGet(url, [onResponse](std::vector<char> bytes) {
engine->getNetwork().get(url, [onResponse](std::vector<char> bytes) {
engine->postRunnable([=]() {
onResponse({std::string(bytes.data(), bytes.size())});
});
@ -25,7 +25,7 @@ static int l_http_get_binary(lua::State* L) {
lua::pushvalue(L, 2);
auto onResponse = lua::create_lambda(L);
engine->getNetwork().httpGet(url, [onResponse](std::vector<char> bytes) {
engine->getNetwork().get(url, [onResponse](std::vector<char> bytes) {
auto buffer = std::make_shared<util::Buffer<ubyte>>(
reinterpret_cast<const ubyte*>(bytes.data()), bytes.size()
);

View File

@ -31,7 +31,7 @@ struct Request {
long maxSize;
};
class CurlHttp : public Http {
class CurlRequests : public Requests {
CURLM* multiHandle;
CURL* curl;
@ -45,11 +45,11 @@ class CurlHttp : public Http {
std::queue<Request> requests;
public:
CurlHttp(CURLM* multiHandle, CURL* curl)
CurlRequests(CURLM* multiHandle, CURL* curl)
: multiHandle(multiHandle), curl(curl) {
}
virtual ~CurlHttp() {
virtual ~CurlRequests() {
curl_easy_cleanup(curl);
curl_multi_remove_handle(multiHandle, curl);
curl_multi_cleanup(multiHandle);
@ -156,7 +156,7 @@ public:
return totalDownload;
}
static std::unique_ptr<CurlHttp> create() {
static std::unique_ptr<CurlRequests> create() {
auto curl = curl_easy_init();
if (curl == nullptr) {
throw std::runtime_error("could not initialzie cURL");
@ -166,7 +166,7 @@ public:
curl_easy_cleanup(curl);
throw std::runtime_error("could not initialzie cURL-multi");
}
return std::make_unique<CurlHttp>(multiHandle, curl);
return std::make_unique<CurlRequests>(multiHandle, curl);
}
};
@ -325,32 +325,23 @@ public:
}
};
class SocketTcp : public Tcp {
public:
SocketTcp() {};
std::shared_ptr<Socket> connect(const std::string& address, int port) override {
return SocketImpl::connect(address, port);
}
};
Network::Network(std::unique_ptr<Http> http, std::unique_ptr<Tcp> tcp)
: http(std::move(http)), tcp(std::move(tcp)) {
Network::Network(std::unique_ptr<Requests> requests)
: requests(std::move(requests)) {
}
Network::~Network() = default;
void Network::httpGet(
void Network::get(
const std::string& url,
OnResponse onResponse,
OnReject onReject,
long maxSize
) {
http->get(url, onResponse, onReject, maxSize);
requests->get(url, onResponse, onReject, maxSize);
}
std::shared_ptr<Socket> Network::connect(const std::string& address, int port) {
auto socket = tcp->connect(address, port);
auto socket = SocketImpl::connect(address, port);
connections.push_back(socket);
return socket;
}
@ -360,7 +351,7 @@ size_t Network::getTotalUpload() const {
for (const auto& socket : connections) {
totalUpload += socket->getTotalUpload();
}
return http->getTotalUpload() + totalUpload;
return requests->getTotalUpload() + totalUpload;
}
size_t Network::getTotalDownload() const {
@ -368,15 +359,14 @@ size_t Network::getTotalDownload() const {
for (const auto& socket : connections) {
totalDownload += socket->getTotalDownload();
}
return http->getTotalDownload() + totalDownload;
return requests->getTotalDownload() + totalDownload;
}
void Network::update() {
http->update();
requests->update();
}
std::unique_ptr<Network> Network::create(const NetworkSettings& settings) {
auto http = CurlHttp::create();
auto tcp = std::make_unique<SocketTcp>();
return std::make_unique<Network>(std::move(http), std::move(tcp));
auto requests = CurlRequests::create();
return std::make_unique<Network>(std::move(requests));
}

View File

@ -11,9 +11,9 @@ namespace network {
using OnResponse = std::function<void(std::vector<char>)>;
using OnReject = std::function<void(const char*)>;
class Http {
class Requests {
public:
virtual ~Http() {}
virtual ~Requests() {}
virtual void get(
const std::string& url,
@ -38,24 +38,14 @@ namespace network {
virtual size_t getTotalDownload() const = 0;
};
class Tcp {
public:
virtual ~Tcp() {}
virtual std::shared_ptr<Socket> connect(
const std::string& address, int port
) = 0;
};
class Network {
std::unique_ptr<Http> http;
std::unique_ptr<Tcp> tcp;
std::unique_ptr<Requests> requests;
std::vector<std::shared_ptr<Socket>> connections;
public:
Network(std::unique_ptr<Http> http, std::unique_ptr<Tcp> tcp);
Network(std::unique_ptr<Requests> requests);
~Network();
void httpGet(
void get(
const std::string& url,
OnResponse onResponse,
OnReject onReject = nullptr,

View File

@ -6,7 +6,7 @@
TEST(curltest, curltest) {
NetworkSettings settings {};
auto network = network::Network::create(settings);
network->httpGet(
network->get(
"https://raw.githubusercontent.com/MihailRis/VoxelEngine-Cpp/refs/"
"heads/curl/res/content/base/blocks/lamp.json",
[](std::vector<char> data) {