Audacity 3.2.0
CurlResponseFactory.cpp
Go to the documentation of this file.
1/*!********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file CurlResponseFactory.cpp
6 @brief Define an implementation of IResponseFactory using libcurl.
7
8 Dmitry Vedenko
9 **********************************************************************/
10
11#include "CurlResponseFactory.h"
12
13#include <algorithm>
14
15#include "CurlResponse.h"
16#include "MultipartData.h"
17
18namespace audacity
19{
20namespace network_manager
21{
22
23constexpr decltype(std::thread::hardware_concurrency ()) MIN_CURL_THREADS = 6;
24
26 : mThreadPool (std::make_unique<ThreadPool>(
27 std::max (
29 std::thread::hardware_concurrency ()
30 )))
31{
32
33}
34
35void CurlResponseFactory::setProxy (const std::string& proxy)
36{
37 mHandleManager->setProxy (proxy);
38}
39
41{
42 return performRequest (verb, request, nullptr, 0);
43}
44
45ResponsePtr CurlResponseFactory::performRequest (RequestVerb verb, const Request& request, const void* data, size_t size)
46{
47 if (!mThreadPool)
48 return {};
49
50 std::shared_ptr<CurlResponse> response = std::make_shared<CurlResponse> (
51 verb, request, mHandleManager.get ()
52 );
53
54 std::vector<uint8_t> buffer;
55
56 if (data != nullptr && size != 0)
57 {
58 const uint8_t* start = static_cast<const uint8_t*>(data);
59 const uint8_t* end = static_cast<const uint8_t*>(data) + size;
60
61 buffer.insert (buffer.begin (), start, end);
62 }
63
64 mThreadPool->enqueue ([response, dataBuffer = std::move (buffer)]() {
65 if (!dataBuffer.empty())
66 response->setPayload (dataBuffer.data (), dataBuffer.size ());
67
68 response->perform ();
69 });
70
71 return response;
72}
73
75 RequestVerb verb, const Request& request,
76 std::unique_ptr<MultipartData> form)
77{
78 if (!mThreadPool)
79 return {};
80
81 std::shared_ptr<CurlResponse> response =
82 std::make_shared<CurlResponse>(verb, request, mHandleManager.get());
83
84
85 mThreadPool->enqueue(
86 [response, rawForm = form.release()]() mutable
87 {
88 if (rawForm != nullptr && !rawForm->IsEmpty())
89 response->setForm(std::unique_ptr<MultipartData>(rawForm));
90
91 response->perform();
92 });
93
94 return response;
95}
96
98{
99 mThreadPool.reset ();
100 mHandleManager.reset ();
101}
102
103}
104}
Declare an implementation of IResponse using libcurl.
Declare an implementation of IResponseFactory using libcurl.
ResponsePtr performRequest(RequestVerb verb, const Request &request) override
std::unique_ptr< CurlHandleManager > mHandleManager
void setProxy(const std::string &proxy) override
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:159
std::shared_ptr< IResponse > ResponsePtr
constexpr decltype(std::thread::hardware_concurrency()) MIN_CURL_THREADS
STL namespace.