audacia/libraries/lib-network-manager/curl/CurlResponseFactory.cpp

81 lines
1.9 KiB
C++

/*!********************************************************************
Audacity: A Digital Audio Editor
@file CurlResponseFactory.cpp
@brief Define an implementation of IResponseFactory using libcurl.
Dmitry Vedenko
**********************************************************************/
#include "CurlResponseFactory.h"
#include <algorithm>
#include "CurlResponse.h"
namespace audacity
{
namespace network_manager
{
constexpr decltype(std::thread::hardware_concurrency ()) MIN_CURL_THREADS = 6;
CurlResponseFactory::CurlResponseFactory ()
: mThreadPool (std::make_unique<ThreadPool>(
std::max (
MIN_CURL_THREADS,
std::thread::hardware_concurrency ()
)))
{
}
void CurlResponseFactory::setProxy (const std::string& proxy)
{
mHandleManager->setProxy (proxy);
}
ResponsePtr CurlResponseFactory::performRequest (RequestVerb verb, const Request& request)
{
return performRequest (verb, request, nullptr, 0);
}
ResponsePtr CurlResponseFactory::performRequest (RequestVerb verb, const Request& request, const void* data, size_t size)
{
if (!mThreadPool)
return {};
std::shared_ptr<CurlResponse> response = std::make_shared<CurlResponse> (
verb, request, mHandleManager.get ()
);
std::vector<uint8_t> buffer;
if (data != nullptr && size != 0)
{
const uint8_t* start = static_cast<const uint8_t*>(data);
const uint8_t* end = static_cast<const uint8_t*>(data) + size;
buffer.insert (buffer.begin (), start, end);
}
mThreadPool->enqueue ([response, dataBuffer = std::move (buffer)]() {
if (!dataBuffer.empty())
response->perform (dataBuffer.data (), dataBuffer.size ());
else
response->perform (nullptr, 0);
});
return response;
}
void CurlResponseFactory::terminate ()
{
mThreadPool.reset ();
mHandleManager.reset ();
}
}
}