Changed http client to be instanciated by services
This commit is contained in:
@@ -27,7 +27,7 @@ IOContextRunner::IOContextRunner(boost::asio::io_service& ioService, std::size_t
|
||||
: _ioService {ioService}
|
||||
, _work {ioService}
|
||||
{
|
||||
LMS_LOG(UTILS, INFO) << "Starting IO Context with " << threadCount << " threads...";
|
||||
LMS_LOG(UTILS, INFO) << "Starting IO context with " << threadCount << " threads...";
|
||||
for (std::size_t i {}; i < threadCount; ++i)
|
||||
{
|
||||
_threads.emplace_back([&]
|
||||
@@ -48,10 +48,10 @@ IOContextRunner::IOContextRunner(boost::asio::io_service& ioService, std::size_t
|
||||
void
|
||||
IOContextRunner::stop()
|
||||
{
|
||||
LMS_LOG(UTILS, INFO) << "Stopping IO Context";
|
||||
LMS_LOG(UTILS, DEBUG) << "Stopping IO context...";
|
||||
_work.reset();
|
||||
_ioService.stop();
|
||||
LMS_LOG(UTILS, INFO) << "Stopped IO Context";
|
||||
LMS_LOG(UTILS, DEBUG) << "IO context stopped!";
|
||||
}
|
||||
|
||||
IOContextRunner::~IOContextRunner()
|
||||
|
||||
@@ -23,51 +23,21 @@
|
||||
namespace Http
|
||||
{
|
||||
std::unique_ptr<IClient>
|
||||
createClient(boost::asio::io_context& ioContext)
|
||||
createClient(boost::asio::io_context& ioContext, std::string_view baseUrl)
|
||||
{
|
||||
return std::make_unique<Client>(ioContext);
|
||||
return std::make_unique<Client>(ioContext, baseUrl);
|
||||
}
|
||||
|
||||
void
|
||||
Client::sendGETRequest(ClientGETRequestParameters&& GETParams)
|
||||
{
|
||||
SendQueue& sendQueue {getOrCreateSendQueue(GETParams.url)};
|
||||
sendQueue.sendRequest(std::make_unique<ClientRequest>(std::move(GETParams)));
|
||||
_sendQueue.sendRequest(std::make_unique<ClientRequest>(std::move(GETParams)));
|
||||
}
|
||||
|
||||
void
|
||||
Client::sendPOSTRequest(ClientPOSTRequestParameters&& POSTParams)
|
||||
{
|
||||
SendQueue& sendQueue {getOrCreateSendQueue(POSTParams.url)};
|
||||
sendQueue.sendRequest(std::make_unique<ClientRequest>(std::move(POSTParams)));
|
||||
_sendQueue.sendRequest(std::make_unique<ClientRequest>(std::move(POSTParams)));
|
||||
}
|
||||
|
||||
SendQueue&
|
||||
Client::getOrCreateSendQueue(const std::string& url)
|
||||
{
|
||||
Wt::Http::Client::URL parsedURL;
|
||||
if (!Wt::Http::Client::parseUrl(url, parsedURL))
|
||||
throw LmsException {"Cannot parse URL '" + url + "'"};
|
||||
|
||||
{
|
||||
std::shared_lock lock {_sendQueuesMutex};
|
||||
|
||||
if (auto it = _sendQueues.find(parsedURL.host); it != std::cend(_sendQueues))
|
||||
return it->second;
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_lock lock {_sendQueuesMutex};
|
||||
|
||||
if (auto it = _sendQueues.find(parsedURL.host); it != std::cend(_sendQueues))
|
||||
return it->second;
|
||||
|
||||
auto [it, inserted] {_sendQueues.emplace(parsedURL.host, _ioContext)};
|
||||
assert(inserted);
|
||||
|
||||
return it->second;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Http
|
||||
|
||||
|
||||
@@ -31,17 +31,17 @@ namespace Http
|
||||
class Client final : public IClient
|
||||
{
|
||||
public:
|
||||
Client(boost::asio::io_context& ioContext) : _ioContext {ioContext} {}
|
||||
Client(boost::asio::io_context& ioContext, std::string_view baseUrl)
|
||||
: _ioContext {ioContext}
|
||||
, _sendQueue {ioContext, baseUrl}
|
||||
{}
|
||||
|
||||
private:
|
||||
void sendGETRequest(ClientGETRequestParameters&& request) override;
|
||||
void sendPOSTRequest(ClientPOSTRequestParameters&& request) override;
|
||||
|
||||
SendQueue& getOrCreateSendQueue(const std::string& host);
|
||||
|
||||
boost::asio::io_context& _ioContext;
|
||||
std::shared_mutex _sendQueuesMutex;
|
||||
std::unordered_map<std::string, SendQueue> _sendQueues;
|
||||
boost::asio::io_context& _ioContext;
|
||||
SendQueue _sendQueue;
|
||||
};
|
||||
} // namespace Http
|
||||
|
||||
|
||||
@@ -60,8 +60,9 @@ namespace
|
||||
|
||||
namespace Http
|
||||
{
|
||||
SendQueue::SendQueue(boost::asio::io_context& ioContext)
|
||||
SendQueue::SendQueue(boost::asio::io_context& ioContext, std::string_view baseUrl)
|
||||
: _ioContext {ioContext}
|
||||
, _baseUrl {baseUrl}
|
||||
{
|
||||
_client.done().connect([this](Wt::AsioWrapper::error_code ec, const Wt::Http::Message& msg)
|
||||
{
|
||||
@@ -116,17 +117,18 @@ namespace Http
|
||||
bool
|
||||
SendQueue::sendRequest(const ClientRequest& request)
|
||||
{
|
||||
LOG(DEBUG) << "Sending request to url '" << request.getParameters().url << "'";
|
||||
std::string url {_baseUrl + request.getParameters().relativeUrl};
|
||||
LOG(DEBUG) << "Sending request to url '" << url << "'";
|
||||
|
||||
bool res {};
|
||||
switch (request.getType())
|
||||
{
|
||||
case ClientRequest::Type::GET:
|
||||
res = _client.get(request.getParameters().url, request.getGETParameters().headers);
|
||||
res = _client.get(url, request.getGETParameters().headers);
|
||||
break;
|
||||
|
||||
case ClientRequest::Type::POST:
|
||||
res = _client.post(request.getParameters().url, request.getPOSTParameters().message);
|
||||
res = _client.post(url, request.getPOSTParameters().message);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace Http
|
||||
class SendQueue
|
||||
{
|
||||
public:
|
||||
SendQueue(boost::asio::io_context& ioContext);
|
||||
SendQueue(boost::asio::io_context& ioContext, std::string_view baseUrl);
|
||||
~SendQueue();
|
||||
|
||||
SendQueue(const SendQueue&) = delete;
|
||||
@@ -62,6 +62,7 @@ namespace Http
|
||||
boost::asio::io_context& _ioContext;
|
||||
boost::asio::io_context::strand _strand {_ioContext};
|
||||
boost::asio::steady_timer _throttleTimer {_ioContext};
|
||||
std::string _baseUrl;
|
||||
|
||||
enum class State
|
||||
{
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Http
|
||||
};
|
||||
|
||||
Priority priority {Priority::Normal};
|
||||
std::string url;
|
||||
std::string relativeUrl; // relative to baseUrl used by the client
|
||||
|
||||
using OnSuccessFunc = std::function<void(std::string_view msgBody)>;
|
||||
OnSuccessFunc onSuccessFunc;
|
||||
|
||||
@@ -35,6 +35,6 @@ namespace Http
|
||||
virtual void sendPOSTRequest(ClientPOSTRequestParameters&& request) = 0;
|
||||
};
|
||||
|
||||
std::unique_ptr<IClient> createClient(boost::asio::io_context& ioContext);
|
||||
std::unique_ptr<IClient> createClient(boost::asio::io_context& ioContext, std::string_view baseUrl);
|
||||
} // namespace Http
|
||||
|
||||
|
||||
Reference in New Issue
Block a user