Audacity 3.2.0
Public Member Functions | Static Private Member Functions | Private Attributes | List of all members
audacity::network_manager::CurlResponse Class Referencefinal

#include <CurlResponse.h>

Inheritance diagram for audacity::network_manager::CurlResponse:
[legend]
Collaboration diagram for audacity::network_manager::CurlResponse:
[legend]

Public Member Functions

 CurlResponse (RequestVerb verb, const Request &request, CurlHandleManager *handleManager) noexcept
 
bool isFinished () const noexcept override
 
unsigned getHTTPCode () const noexcept override
 
NetworkError getError () const noexcept override
 
std::string getErrorString () const override
 
bool headersReceived () const noexcept override
 
bool hasHeader (const std::string &headerName) const noexcept override
 
std::string getHeader (const std::string &headerName) const override
 
const HeadersListgetHeaders () const noexcept override
 
const CookiesListgetCookies () const noexcept override
 
const RequestgetRequest () const noexcept override
 
std::string getURL () const override
 
void abort () noexcept override
 
void setOnDataReceivedCallback (RequestCallback callback) override
 
void setRequestFinishedCallback (RequestCallback callback) override
 
virtual void setDownloadProgressCallback (ProgressCallback callback) override
 Set the download progress callback. More...
 
virtual void setUploadProgressCallback (ProgressCallback callback) override
 Set the upload progress callback. More...
 
uint64_t getBytesAvailable () const noexcept override
 
uint64_t readData (void *buffer, uint64_t maxBytesCount) override
 
void setPayload (const void *ptr, size_t size)
 
void setForm (std::unique_ptr< MultipartData > form)
 
void perform ()
 
- Public Member Functions inherited from audacity::network_manager::IResponse
virtual ~IResponse ()=default
 
virtual bool isFinished () const noexcept=0
 
virtual unsigned getHTTPCode () const noexcept=0
 
virtual NetworkError getError () const noexcept=0
 
virtual std::string getErrorString () const =0
 
virtual bool headersReceived () const noexcept=0
 
virtual bool hasHeader (const std::string &headerName) const noexcept=0
 
virtual std::string getHeader (const std::string &headerName) const =0
 
virtual const HeadersListgetHeaders () const noexcept=0
 
virtual const CookiesListgetCookies () const noexcept=0
 
virtual const RequestgetRequest () const noexcept=0
 
virtual std::string getURL () const =0
 
virtual void abort () noexcept=0
 
virtual void setOnDataReceivedCallback (RequestCallback callback)=0
 
virtual void setRequestFinishedCallback (RequestCallback callback)=0
 
virtual void setDownloadProgressCallback (ProgressCallback callback)=0
 Set the download progress callback. More...
 
virtual void setUploadProgressCallback (ProgressCallback callback)=0
 Set the upload progress callback. More...
 
virtual uint64_t getBytesAvailable () const noexcept=0
 
virtual uint64_t readData (void *buffer, uint64_t maxBytesCount)=0
 
template<typename RetVal = std::vector<uint8_t>>
RetVal readAll ()
 

Static Private Member Functions

static size_t WriteCallback (const uint8_t *ptr, size_t size, size_t nmemb, CurlResponse *userdata) noexcept
 
static size_t HeaderCallback (const char *buffer, size_t size, size_t nitems, CurlResponse *userdata) noexcept
 
static int CurlProgressCallback (CurlResponse *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) noexcept
 

Private Attributes

RequestVerb mVerb
 
Request mRequest
 
CurlHandleManagermHandleManager
 
CurlHandleManager::HandlemCurrentHandle { nullptr }
 
std::mutex mCallbackMutex
 
RequestCallback mOnDataReceivedCallback
 
RequestCallback mRequestFinishedCallback
 
ProgressCallback mDownloadProgressCallback
 
ProgressCallback mUploadProgressCallback
 
std::mutex mHeadersMutex
 
HeadersList mResponseHeaders
 
CookiesList mResponseCookies
 
std::mutex mDataBufferMutex
 
std::deque< uint8_t > mDataBuffer
 
std::recursive_mutex mStatusMutex
 
NetworkError mNetworkError { NetworkError::NoError }
 
std::string mErrorString
 
unsigned mHttpCode { 0 }
 
const void * mPayload { nullptr }
 
size_t mPayloadSize { 0 }
 
std::unique_ptr< MultipartDatamForm
 
bool mHeadersReceived { false }
 
bool mRequestFinished { false }
 
bool mAbortRequested { false }
 

Additional Inherited Members

- Public Types inherited from audacity::network_manager::IResponse
using RequestCallback = std::function< void(IResponse *)>
 
using ProgressCallback = std::function< void(int64_t current, int64_t expected)>
 

Detailed Description

Definition at line 32 of file CurlResponse.h.

Constructor & Destructor Documentation

◆ CurlResponse()

audacity::network_manager::CurlResponse::CurlResponse ( RequestVerb  verb,
const Request request,
CurlHandleManager handleManager 
)
noexcept

Definition at line 120 of file CurlResponse.cpp.

121 : mVerb(verb),
122 mRequest(request),
123 mHandleManager (handleManager)
124{
125}

Member Function Documentation

◆ abort()

void audacity::network_manager::CurlResponse::abort ( )
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 191 of file CurlResponse.cpp.

192{
193 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
194 mAbortRequested = true;
195}

References mAbortRequested, and mStatusMutex.

◆ CurlProgressCallback()

int audacity::network_manager::CurlResponse::CurlProgressCallback ( CurlResponse clientp,
curl_off_t  dltotal,
curl_off_t  dlnow,
curl_off_t  ultotal,
curl_off_t  ulnow 
)
staticprivatenoexcept

Definition at line 468 of file CurlResponse.cpp.

471{
472 {
473 std::lock_guard<std::recursive_mutex> lock(clientp->mStatusMutex);
474
475 if (clientp->mAbortRequested)
476 return -1;
477 }
478
479 std::lock_guard<std::mutex> callbackLock(clientp->mCallbackMutex);
480
481 if (dltotal > 0 && clientp->mDownloadProgressCallback)
482 clientp->mDownloadProgressCallback(dlnow, dltotal);
483
484 if (ultotal > 0 && clientp->mUploadProgressCallback)
485 clientp->mUploadProgressCallback(ulnow, ultotal);
486
487 return CURLE_OK;
488}

Referenced by perform().

Here is the caller graph for this function:

◆ getBytesAvailable()

uint64_t audacity::network_manager::CurlResponse::getBytesAvailable ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 231 of file CurlResponse.cpp.

232{
233 std::lock_guard<std::mutex> lock (mDataBufferMutex);
234 return mDataBuffer.size ();
235}

References mDataBuffer, and mDataBufferMutex.

Referenced by setOnDataReceivedCallback().

Here is the caller graph for this function:

◆ getCookies()

const CookiesList & audacity::network_manager::CurlResponse::getCookies ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 175 of file CurlResponse.cpp.

176{
177 std::lock_guard<std::mutex> lock (mHeadersMutex);
178 return mResponseCookies;
179}

References mHeadersMutex, and mResponseCookies.

◆ getError()

NetworkError audacity::network_manager::CurlResponse::getError ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 139 of file CurlResponse.cpp.

140{
141 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
142 return mNetworkError;
143}

References mNetworkError, and mStatusMutex.

◆ getErrorString()

std::string audacity::network_manager::CurlResponse::getErrorString ( ) const
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 145 of file CurlResponse.cpp.

146{
147 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
148 return mErrorString;
149}

References mErrorString, and mStatusMutex.

◆ getHeader()

std::string audacity::network_manager::CurlResponse::getHeader ( const std::string &  headerName) const
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 163 of file CurlResponse.cpp.

164{
165 std::lock_guard<std::mutex> lock (mHeadersMutex);
166 return mResponseHeaders.getHeaderValue (headerName);
167}
std::string getHeaderValue(const std::string &headerName) const

References audacity::network_manager::HeadersList::getHeaderValue(), mHeadersMutex, and mResponseHeaders.

Here is the call graph for this function:

◆ getHeaders()

const HeadersList & audacity::network_manager::CurlResponse::getHeaders ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 169 of file CurlResponse.cpp.

170{
171 std::lock_guard<std::mutex> lock (mHeadersMutex);
172 return mResponseHeaders;
173}

References mHeadersMutex, and mResponseHeaders.

◆ getHTTPCode()

unsigned audacity::network_manager::CurlResponse::getHTTPCode ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 133 of file CurlResponse.cpp.

134{
135 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
136 return mHttpCode;
137}

References mHttpCode, and mStatusMutex.

◆ getRequest()

const Request & audacity::network_manager::CurlResponse::getRequest ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 181 of file CurlResponse.cpp.

182{
183 return mRequest;
184}

References mRequest.

◆ getURL()

std::string audacity::network_manager::CurlResponse::getURL ( ) const
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 186 of file CurlResponse.cpp.

187{
188 return mRequest.getURL ();
189}
const std::string & getURL() const noexcept
Definition: Request.cpp:41

References audacity::network_manager::Request::getURL(), and mRequest.

Here is the call graph for this function:

◆ hasHeader()

bool audacity::network_manager::CurlResponse::hasHeader ( const std::string &  headerName) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 157 of file CurlResponse.cpp.

158{
159 std::lock_guard<std::mutex> lock (mHeadersMutex);
160 return mResponseHeaders.hasHeader (headerName);
161}
bool hasHeader(const std::string &headerName) const noexcept

◆ HeaderCallback()

size_t audacity::network_manager::CurlResponse::HeaderCallback ( const char *  buffer,
size_t  size,
size_t  nitems,
CurlResponse userdata 
)
staticprivatenoexcept

Definition at line 429 of file CurlResponse.cpp.

430{
431 {
432 std::lock_guard<std::recursive_mutex> lock (request->mStatusMutex);
433
434 if (request->mAbortRequested)
435 return 0;
436
437 // HeaderCallback is called by the handle
438 assert (request->mCurrentHandle != nullptr);
439
440 if (request->mCurrentHandle != nullptr)
441 request->mHttpCode = request->mCurrentHandle->getHTTPCode ();
442 }
443
444 size = size * nitems;
445
446 if (size < 2)
447 return 0;
448
449 const Header header = Header::Parse (std::string (buffer, size - 2));
450
451 std::lock_guard<std::mutex> lock (request->mHeadersMutex);
452
453 if (header.hasSameName ("Set-Cookie"))
454 {
455 request->mResponseCookies.addCookie (Cookie::Parse (header.Value));
456 }
457 else
458 {
459 if (header.hasSameName ("Keep-Alive"))
460 request->mCurrentHandle->markKeepAlive ();
461
462 request->mResponseHeaders.addHeader (header);
463 }
464
465 return size;
466}
A string pair, representing HTTP header.
static Header Parse(const std::string &header)
Definition: HeadersList.cpp:79

References audacity::network_manager::Header::hasSameName(), audacity::network_manager::Cookie::Parse(), audacity::network_manager::Header::Parse(), size, and audacity::network_manager::Header::Value.

Referenced by perform().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ headersReceived()

bool audacity::network_manager::CurlResponse::headersReceived ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 151 of file CurlResponse.cpp.

152{
153 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
154 return mHeadersReceived;
155}

References mHeadersReceived, and mStatusMutex.

◆ isFinished()

bool audacity::network_manager::CurlResponse::isFinished ( ) const
overridevirtualnoexcept

Implements audacity::network_manager::IResponse.

Definition at line 127 of file CurlResponse.cpp.

128{
129 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
130 return mRequestFinished;
131}

References mRequestFinished, and mStatusMutex.

◆ perform()

void audacity::network_manager::CurlResponse::perform ( )

Definition at line 270 of file CurlResponse.cpp.

271{
272 CurlHandleManager::Handle handle = mHandleManager->getHandle (mVerb, mRequest.getURL ());
273
274 handle.setOption (CURLOPT_WRITEFUNCTION, WriteCallback);
275 handle.setOption (CURLOPT_WRITEDATA, this);
276
277 handle.setOption (CURLOPT_HEADERFUNCTION, HeaderCallback);
278 handle.setOption (CURLOPT_HEADERDATA, this);
279
280 handle.setOption (CURLOPT_XFERINFOFUNCTION, CurlProgressCallback);
281 handle.setOption (CURLOPT_XFERINFODATA, this);
282
283 handle.setOption (CURLOPT_FOLLOWLOCATION, mRequest.getMaxRedirects () == 0 ? 0 : 1);
284 handle.setOption (CURLOPT_MAXREDIRS, mRequest.getMaxRedirects ());
285
286 handle.setOption (CURLOPT_NOPROGRESS, 0L);
287
288 handle.setOption (CURLOPT_CONNECTTIMEOUT_MS,
289 std::chrono::duration_cast<std::chrono::milliseconds> (mRequest.getTimeout()).count ()
290 );
291
292 handle.appendCookies (mRequest.getCookies ());
293
294 DataStream ds { reinterpret_cast<const char*>(mPayload), mPayloadSize };
295 curl_mime* mimeList = nullptr;
296
297 if (mForm != nullptr)
298 {
299 mimeList = curl_mime_init(handle.getCurlHandle());
300
301 for (size_t i = 0; i < mForm->GetPartsCount(); ++i)
302 {
303 auto part = mForm->GetPart(i);
304
305 curl_mimepart* curlPart = curl_mime_addpart(mimeList);
306
307 const auto& headers = part->GetHeaders();
308
309 if (headers.getHeadersCount() > 0)
310 {
311 curl_slist* partHeaders = nullptr;
312
313 for (auto header : headers)
314 {
315 partHeaders = curl_slist_append(
316 partHeaders, (header.Name + ": " + header.Value).c_str());
317 }
318
319 curl_mime_headers(curlPart, partHeaders, 1);
320 }
321
322 curl_mime_data_cb(
323 curlPart, part->GetSize(), curl_read_callback(MimePartRead),
324 curl_seek_callback(MimePartSeek), nullptr, part);
325 }
326
327 curl_easy_setopt(handle.getCurlHandle(), CURLOPT_MIMEPOST, mimeList);
328 }
329 else if (mPayload != nullptr && mPayloadSize != 0)
330 {
331 handle.appendHeader ({ "Transfer-Encoding", std::string () });
332 handle.appendHeader({ "Content-Length", std::to_string(mPayloadSize) });
333
335 handle.setOption(CURLOPT_POSTFIELDSIZE_LARGE, mPayloadSize);
336 else
337 handle.setOption(CURLOPT_INFILESIZE_LARGE, mPayloadSize);
338
339 handle.setOption (CURLOPT_READFUNCTION, DataStreamRead);
340 handle.setOption (CURLOPT_READDATA, &ds);
341
342 handle.setOption (CURLOPT_SEEKFUNCTION, DataStreamSeek);
343 handle.setOption (CURLOPT_SEEKDATA, &ds);
344 }
346 {
347 handle.setOption (CURLOPT_POSTFIELDS, "");
348 handle.setOption (CURLOPT_POSTFIELDSIZE, 0);
349 }
350
351 auto cleanupMime = finally(
352 [mimeList]() {
353 if (mimeList != nullptr)
354 curl_mime_free(mimeList);
355 });
356
357 handle.appendHeaders (mRequest.getHeaders ());
358
359 mCurrentHandle = &handle;
360 const auto result = handle.perform ();
361 mCurrentHandle = nullptr;
362
363 {
364 std::lock_guard<std::recursive_mutex> lock (mStatusMutex);
365
366 if (result.Code != CURLE_OK)
367 {
368 const auto it = errorsMap.find (result.Code);
369
370 mNetworkError = it != errorsMap.end () ? it->second : NetworkError::UnknownError;
371 mErrorString = result.Message;
372 }
373 else
374 {
375 if (mHttpCode == 0)
376 mHttpCode = handle.getHTTPCode ();
377 }
378
379 mRequestFinished = true;
380 }
381
382 std::lock_guard<std::mutex> lock (mCallbackMutex);
383
386
391}
CURLcode setOption(CURLoption option, Args... value) noexcept
Handle getHandle(RequestVerb verb, const std::string &url)
static size_t WriteCallback(const uint8_t *ptr, size_t size, size_t nmemb, CurlResponse *userdata) noexcept
std::unique_ptr< MultipartData > mForm
Definition: CurlResponse.h:106
static int CurlProgressCallback(CurlResponse *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) noexcept
static size_t HeaderCallback(const char *buffer, size_t size, size_t nitems, CurlResponse *userdata) noexcept
CurlHandleManager::Handle * mCurrentHandle
Definition: CurlResponse.h:82
Timeout getTimeout() const noexcept
Definition: Request.cpp:98
const HeadersList & getHeaders() const noexcept
Definition: Request.cpp:58
const CookiesList & getCookies() noexcept
Definition: Request.cpp:75
size_t getMaxRedirects() const noexcept
Definition: Request.cpp:87
size_t MimePartRead(char *ptr, size_t size, size_t nmemb, MultipartData::Part *stream)
int MimePartSeek(MultipartData::Part *stream, curl_off_t offs, int origin) noexcept
int DataStreamSeek(DataStream *stream, curl_off_t offs, int origin) noexcept
size_t DataStreamRead(char *ptr, size_t size, size_t nmemb, DataStream *stream) noexcept
static const std::map< CURLcode, NetworkError > errorsMap

References audacity::network_manager::CurlHandleManager::Handle::appendCookies(), audacity::network_manager::CurlHandleManager::Handle::appendHeader(), audacity::network_manager::CurlHandleManager::Handle::appendHeaders(), CurlProgressCallback(), audacity::network_manager::anonymous_namespace{CurlResponse.cpp}::DataStreamRead(), audacity::network_manager::anonymous_namespace{CurlResponse.cpp}::DataStreamSeek(), audacity::network_manager::anonymous_namespace{CurlResponse.cpp}::errorsMap, audacity::network_manager::Request::getCookies(), audacity::network_manager::CurlHandleManager::Handle::getCurlHandle(), audacity::network_manager::CurlHandleManager::getHandle(), audacity::network_manager::Request::getHeaders(), audacity::network_manager::CurlHandleManager::Handle::getHTTPCode(), audacity::network_manager::Request::getMaxRedirects(), audacity::network_manager::Request::getTimeout(), audacity::network_manager::Request::getURL(), HeaderCallback(), mCallbackMutex, mCurrentHandle, mDownloadProgressCallback, mErrorString, mForm, mHandleManager, mHttpCode, audacity::network_manager::anonymous_namespace{CurlResponse.cpp}::MimePartRead(), audacity::network_manager::anonymous_namespace{CurlResponse.cpp}::MimePartSeek(), mNetworkError, mOnDataReceivedCallback, mPayload, mPayloadSize, mRequest, mRequestFinished, mRequestFinishedCallback, mStatusMutex, mUploadProgressCallback, mVerb, audacity::network_manager::Patch, audacity::network_manager::CurlHandleManager::Handle::perform(), audacity::network_manager::Post, audacity::network_manager::Put, audacity::network_manager::CurlHandleManager::Handle::setOption(), audacity::network_manager::UnknownError, and WriteCallback().

Here is the call graph for this function:

◆ readData()

uint64_t audacity::network_manager::CurlResponse::readData ( void *  buffer,
uint64_t  maxBytesCount 
)
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 237 of file CurlResponse.cpp.

238{
239 if (buffer == nullptr || maxBytesCount == 0)
240 return 0;
241
242 std::lock_guard<std::mutex> lock (mDataBufferMutex);
243
244 if (mDataBuffer.empty ())
245 return 0;
246
247 maxBytesCount = std::min<uint64_t> (maxBytesCount, mDataBuffer.size ());
248
249 const auto begin = mDataBuffer.begin ();
250 const auto end = begin + maxBytesCount;
251
252 std::copy (begin, end, static_cast<uint8_t*> (buffer));
253
254 mDataBuffer.erase (begin, end);
255
256 return maxBytesCount;
257}
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:159
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
Definition: PackedArray.h:150
void copy(const T *src, T *dst, int32_t n)
Definition: VectorOps.h:40

References PackedArray::begin(), staffpad::vo::copy(), PackedArray::end(), mDataBuffer, and mDataBufferMutex.

Here is the call graph for this function:

◆ setDownloadProgressCallback()

void audacity::network_manager::CurlResponse::setDownloadProgressCallback ( ProgressCallback  callback)
overridevirtual

Set the download progress callback.

Implements audacity::network_manager::IResponse.

Definition at line 219 of file CurlResponse.cpp.

220{
221 std::lock_guard<std::mutex> callbackLock(mCallbackMutex);
222 mDownloadProgressCallback = std::move(callback);
223}

References mCallbackMutex, and mDownloadProgressCallback.

◆ setForm()

void audacity::network_manager::CurlResponse::setForm ( std::unique_ptr< MultipartData form)

Definition at line 265 of file CurlResponse.cpp.

266{
267 mForm = std::move(form);
268}

References mForm.

◆ setOnDataReceivedCallback()

void audacity::network_manager::CurlResponse::setOnDataReceivedCallback ( RequestCallback  callback)
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 197 of file CurlResponse.cpp.

198{
199 std::lock_guard<std::mutex> lock (mCallbackMutex);
200
201 mOnDataReceivedCallback = std::move (callback);
202
205}
uint64_t getBytesAvailable() const noexcept override

References getBytesAvailable(), mCallbackMutex, and mOnDataReceivedCallback.

Here is the call graph for this function:

◆ setPayload()

void audacity::network_manager::CurlResponse::setPayload ( const void *  ptr,
size_t  size 
)

Definition at line 259 of file CurlResponse.cpp.

260{
261 mPayload = ptr;
263}

References mPayload, mPayloadSize, and size.

◆ setRequestFinishedCallback()

void audacity::network_manager::CurlResponse::setRequestFinishedCallback ( RequestCallback  callback)
overridevirtual

Implements audacity::network_manager::IResponse.

Definition at line 207 of file CurlResponse.cpp.

208{
209 std::lock_guard<std::mutex> callbackLock (mCallbackMutex);
210
211 mRequestFinishedCallback = std::move (callback);
212
213 std::lock_guard<std::recursive_mutex> statusLock (mStatusMutex);
214
217}

References mCallbackMutex, mRequestFinished, mRequestFinishedCallback, and mStatusMutex.

◆ setUploadProgressCallback()

void audacity::network_manager::CurlResponse::setUploadProgressCallback ( ProgressCallback  callback)
overridevirtual

Set the upload progress callback.

Implements audacity::network_manager::IResponse.

Definition at line 225 of file CurlResponse.cpp.

226{
227 std::lock_guard<std::mutex> callbackLock(mCallbackMutex);
228 mUploadProgressCallback = std::move(callback);
229}

References mCallbackMutex, and mUploadProgressCallback.

◆ WriteCallback()

size_t audacity::network_manager::CurlResponse::WriteCallback ( const uint8_t *  ptr,
size_t  size,
size_t  nmemb,
CurlResponse userdata 
)
staticprivatenoexcept

Definition at line 394 of file CurlResponse.cpp.

395{
396 {
397 std::lock_guard<std::recursive_mutex> lock (request->mStatusMutex);
398
399 if (request->mAbortRequested)
400 return 0;
401
402 if (!request->mHeadersReceived)
403 {
404 request->mHeadersReceived = true;
405
406 // WriteCallback is called by the handle
407 assert (request->mCurrentHandle != nullptr);
408
409 if (request->mCurrentHandle != nullptr)
410 request->mHttpCode = request->mCurrentHandle->getHTTPCode ();
411 }
412 }
413
414 size *= nmemb;
415
416 {
417 std::lock_guard<std::mutex> lock (request->mDataBufferMutex);
418 request->mDataBuffer.insert (request->mDataBuffer.end (), ptr, ptr + size);
419 }
420
421 std::lock_guard<std::mutex> lock (request->mCallbackMutex);
422
423 if (request->mOnDataReceivedCallback)
424 request->mOnDataReceivedCallback (request);
425
426 return size;
427}

References nmemb, and size.

Referenced by perform().

Here is the caller graph for this function:

Member Data Documentation

◆ mAbortRequested

bool audacity::network_manager::CurlResponse::mAbortRequested { false }
private

Definition at line 110 of file CurlResponse.h.

Referenced by abort().

◆ mCallbackMutex

std::mutex audacity::network_manager::CurlResponse::mCallbackMutex
mutableprivate

◆ mCurrentHandle

CurlHandleManager::Handle* audacity::network_manager::CurlResponse::mCurrentHandle { nullptr }
private

Definition at line 82 of file CurlResponse.h.

Referenced by perform().

◆ mDataBuffer

std::deque<uint8_t> audacity::network_manager::CurlResponse::mDataBuffer
private

Definition at line 95 of file CurlResponse.h.

Referenced by getBytesAvailable(), and readData().

◆ mDataBufferMutex

std::mutex audacity::network_manager::CurlResponse::mDataBufferMutex
mutableprivate

Definition at line 94 of file CurlResponse.h.

Referenced by getBytesAvailable(), and readData().

◆ mDownloadProgressCallback

ProgressCallback audacity::network_manager::CurlResponse::mDownloadProgressCallback
private

Definition at line 87 of file CurlResponse.h.

Referenced by perform(), and setDownloadProgressCallback().

◆ mErrorString

std::string audacity::network_manager::CurlResponse::mErrorString
private

Definition at line 100 of file CurlResponse.h.

Referenced by getErrorString(), and perform().

◆ mForm

std::unique_ptr<MultipartData> audacity::network_manager::CurlResponse::mForm
private

Definition at line 106 of file CurlResponse.h.

Referenced by perform(), and setForm().

◆ mHandleManager

CurlHandleManager* audacity::network_manager::CurlResponse::mHandleManager
private

Definition at line 80 of file CurlResponse.h.

Referenced by perform().

◆ mHeadersMutex

std::mutex audacity::network_manager::CurlResponse::mHeadersMutex
mutableprivate

Definition at line 90 of file CurlResponse.h.

Referenced by getCookies(), getHeader(), and getHeaders().

◆ mHeadersReceived

bool audacity::network_manager::CurlResponse::mHeadersReceived { false }
private

Definition at line 108 of file CurlResponse.h.

Referenced by headersReceived().

◆ mHttpCode

unsigned audacity::network_manager::CurlResponse::mHttpCode { 0 }
private

Definition at line 102 of file CurlResponse.h.

Referenced by getHTTPCode(), and perform().

◆ mNetworkError

NetworkError audacity::network_manager::CurlResponse::mNetworkError { NetworkError::NoError }
private

Definition at line 99 of file CurlResponse.h.

Referenced by getError(), and perform().

◆ mOnDataReceivedCallback

RequestCallback audacity::network_manager::CurlResponse::mOnDataReceivedCallback
private

Definition at line 85 of file CurlResponse.h.

Referenced by perform(), and setOnDataReceivedCallback().

◆ mPayload

const void* audacity::network_manager::CurlResponse::mPayload { nullptr }
private

Definition at line 104 of file CurlResponse.h.

Referenced by perform(), and setPayload().

◆ mPayloadSize

size_t audacity::network_manager::CurlResponse::mPayloadSize { 0 }
private

Definition at line 105 of file CurlResponse.h.

Referenced by perform(), and setPayload().

◆ mRequest

Request audacity::network_manager::CurlResponse::mRequest
private

Definition at line 79 of file CurlResponse.h.

Referenced by getRequest(), getURL(), and perform().

◆ mRequestFinished

bool audacity::network_manager::CurlResponse::mRequestFinished { false }
private

Definition at line 109 of file CurlResponse.h.

Referenced by isFinished(), perform(), and setRequestFinishedCallback().

◆ mRequestFinishedCallback

RequestCallback audacity::network_manager::CurlResponse::mRequestFinishedCallback
private

Definition at line 86 of file CurlResponse.h.

Referenced by perform(), and setRequestFinishedCallback().

◆ mResponseCookies

CookiesList audacity::network_manager::CurlResponse::mResponseCookies
private

Definition at line 92 of file CurlResponse.h.

Referenced by getCookies().

◆ mResponseHeaders

HeadersList audacity::network_manager::CurlResponse::mResponseHeaders
private

Definition at line 91 of file CurlResponse.h.

Referenced by getHeader(), and getHeaders().

◆ mStatusMutex

std::recursive_mutex audacity::network_manager::CurlResponse::mStatusMutex
mutableprivate

◆ mUploadProgressCallback

ProgressCallback audacity::network_manager::CurlResponse::mUploadProgressCallback
private

Definition at line 88 of file CurlResponse.h.

Referenced by perform(), and setUploadProgressCallback().

◆ mVerb

RequestVerb audacity::network_manager::CurlResponse::mVerb
private

Definition at line 77 of file CurlResponse.h.

Referenced by perform().


The documentation for this class was generated from the following files: