uvco 0.1
Loading...
Searching...
No Matches
uvco::CurlRequestCore_ Class Reference

Used as awaiter by Curl::download. More...

Public Member Functions

 CurlRequestCore_ (const CurlRequestCore_ &)=delete
 CurlRequestCore_ (CurlRequestCore_ &&)=delete
CurlRequestCore_operator= (const CurlRequestCore_ &)=delete
CurlRequestCore_operator= (CurlRequestCore_ &&)=delete
 CurlRequestCore_ (std::weak_ptr< UvCurlContext_ > ctx)
 CurlRequestCore_ (std::weak_ptr< UvCurlContext_ > ctx, std::string url)
 Construct and initialize download.
 ~CurlRequestCore_ ()
void initCommon (std::string url)
void initGet (std::string url)
void initPost (std::string url, std::span< const std::pair< std::string, std::string > > fields)
std::string_view url () const noexcept
 Get the URL of the request.
void onDataAvailable (char *data, size_t size)
 Called when data is available. Resumes the downloader coroutine.
void onError (uv_status status) noexcept
bool await_ready () const noexcept
bool await_suspend (std::coroutine_handle<> handle) noexcept
 Awaiter protocol: suspend the downloader coroutine.
std::optional< std::string > await_resume ()
 Awaiter protocol: yield the next chunk or signal end of stream.
void setUvStatus (uv_status status) noexcept
 Set socket error status.
void setResponseCode (long status) noexcept
 Set HTTP response code.
void setVerifyResult (long result) noexcept
 Set SSL verification result.
void setCurlStatus (CURLcode status) noexcept
 Set Curl error code.
std::optional< uv_statusuvStatus () const noexcept
 Get uv error status. 0 if success.
std::optional< long > responseCode () const noexcept
 Get HTTP response code. 0 if not set.
std::optional< long > verifyResult () const noexcept
 Get SSL verification result. 0 means success, > 0 means failure.
std::optional< CURLcode > curlStatus () const noexcept
 Get Curl error code once the request has finished.

Static Private Member Functions

static size_t onCurlDataAvailable (char *data, size_t size, size_t nmemb, void *userp)

Private Attributes

std::weak_ptr< UvCurlContext_context_
CURL * easyHandle_
std::string url_
std::optional< std::string > payload_
std::optional< std::coroutine_handle<> > downloaderHandle_
std::vector< std::string > chunks_
std::optional< uv_statusuvStatus_
std::optional< CURLcode > curlStatus_
std::optional< long > responseCode_
std::optional< long > verifyResult_

Friends

class CurlRequest

Detailed Description

Used as awaiter by Curl::download.

Constructor & Destructor Documentation

◆ CurlRequestCore_() [1/4]

uvco::CurlRequestCore_::CurlRequestCore_ ( const CurlRequestCore_ & )
delete

◆ CurlRequestCore_() [2/4]

uvco::CurlRequestCore_::CurlRequestCore_ ( CurlRequestCore_ && )
delete

◆ CurlRequestCore_() [3/4]

uvco::CurlRequestCore_::CurlRequestCore_ ( std::weak_ptr< UvCurlContext_ > ctx)
inlineexplicit
209 : context_{std::move(ctx)}, easyHandle_{curl_easy_init()} {}
std::weak_ptr< UvCurlContext_ > context_
Definition curl.cc:380
CURL * easyHandle_
Definition curl.cc:381

◆ CurlRequestCore_() [4/4]

uvco::CurlRequestCore_::CurlRequestCore_ ( std::weak_ptr< UvCurlContext_ > ctx,
std::string url )
inline

Construct and initialize download.

213 : context_{std::move(ctx)}, easyHandle_(curl_easy_init()) {
214 initGet(std::move(url));
215 }
std::string_view url() const noexcept
Get the URL of the request.
Definition curl.cc:260
void initGet(std::string url)
Definition curl.cc:242

◆ ~CurlRequestCore_()

uvco::CurlRequestCore_::~CurlRequestCore_ ( )
inline
217 {
218 if (!context_.expired()) {
219 context_.lock()->removeHandle(easyHandle_);
220 }
221 curl_easy_cleanup(easyHandle_);
222 easyHandle_ = nullptr;
223 }

Member Function Documentation

◆ await_ready()

bool uvco::CurlRequestCore_::await_ready ( ) const
inlinenodiscardnoexcept

Awaiter protocol: ready if there are chunks to yield or the download is done.

289 {
290 BOOST_ASSERT_MSG(!context_.expired(),
291 "Curl object must outlive any request");
292 // Before checking response code, ensure that it's up-to-date.
293 context_.lock()->checkCurlInfo();
294 return !chunks_.empty() || responseCode_ > 0;
295 }
std::vector< std::string > chunks_
Definition curl.cc:388
std::optional< long > responseCode_
Definition curl.cc:391

◆ await_resume()

std::optional< std::string > uvco::CurlRequestCore_::await_resume ( )
inline

Awaiter protocol: yield the next chunk or signal end of stream.

305 {
306 if (uvStatus_ && *uvStatus_ != 0) {
307 return std::nullopt;
308 }
309 if (verifyResult_ && *verifyResult_ != 0) {
310 // SSL verification to be checked by downloader.
311 return std::nullopt;
312 }
313 if (responseCode_ && *responseCode_ != 200) {
314 // HTTP Status to be checked by downloader.
315 return std::nullopt;
316 }
317 if (!chunks_.empty()) {
318 std::string thisResult = std::move(chunks_.front());
319 chunks_.erase(chunks_.begin());
320 return thisResult;
321 }
322
323 // Signal end of stream.
324 return std::nullopt;
325 }
std::optional< long > verifyResult_
Definition curl.cc:392
std::optional< uv_status > uvStatus_
Definition curl.cc:389

◆ await_suspend()

bool uvco::CurlRequestCore_::await_suspend ( std::coroutine_handle<> handle)
inlinenoexcept

Awaiter protocol: suspend the downloader coroutine.

298 {
299 BOOST_ASSERT(!downloaderHandle_);
300 downloaderHandle_ = handle;
301 return true;
302 }
std::optional< std::coroutine_handle<> > downloaderHandle_
Definition curl.cc:385

◆ curlStatus()

std::optional< CURLcode > uvco::CurlRequestCore_::curlStatus ( ) const
inlinenodiscardnoexcept

Get Curl error code once the request has finished.

373 {
374 return curlStatus_;
375 }
std::optional< CURLcode > curlStatus_
Definition curl.cc:390

◆ initCommon()

void uvco::CurlRequestCore_::initCommon ( std::string url)
inline
225 {
226 BOOST_ASSERT(easyHandle_ != nullptr);
227 BOOST_ASSERT_MSG(url_.empty(), "cannot work with empty URL");
228 BOOST_ASSERT_MSG(!context_.expired(),
229 "Curl object must outlive any request");
230
231 url_ = std::move(url);
232 // Configure easy handle and initiate download.
233 curl_easy_setopt(easyHandle_, CURLOPT_URL, url_.data());
234 curl_easy_setopt(easyHandle_, CURLOPT_WRITEFUNCTION, onCurlDataAvailable);
235 // Set Write Data for use in onCurlDataAvailable.
236 curl_easy_setopt(easyHandle_, CURLOPT_WRITEDATA, this);
237 // Set private data for use in curlSocketFunction.
238 curl_easy_setopt(easyHandle_, CURLOPT_PRIVATE, this);
239 curl_easy_setopt(easyHandle_, CURLOPT_FOLLOWLOCATION, 1L);
240 }
static size_t onCurlDataAvailable(char *data, size_t size, size_t nmemb, void *userp)
Definition curl.cc:395
std::string url_
Definition curl.cc:383

◆ initGet()

void uvco::CurlRequestCore_::initGet ( std::string url)
inline
242 {
243 initCommon(std::move(url));
244 context_.lock()->addHandle(easyHandle_);
245 }
void initCommon(std::string url)
Definition curl.cc:225

◆ initPost()

void uvco::CurlRequestCore_::initPost ( std::string url,
std::span< const std::pair< std::string, std::string > > fields )
inline
248 {
249 initCommon(std::move(url));
250 BOOST_ASSERT(!payload_);
251
252 // Must keep payload alive until request is done.
254 curl_easy_setopt(easyHandle_, CURLOPT_POST, 1L);
255 curl_easy_setopt(easyHandle_, CURLOPT_POSTFIELDS, payload_->c_str());
256 context_.lock()->addHandle(easyHandle_);
257 }
std::optional< std::string > payload_
Definition curl.cc:384
std::string formattedFields(CURL *curl, std::span< const std::pair< std::string, std::string > > fields)
Format a list of fields for POST requests.
Definition curl.cc:46

◆ onCurlDataAvailable()

size_t uvco::CurlRequestCore_::onCurlDataAvailable ( char * data,
size_t size,
size_t nmemb,
void * userp )
staticprivate
396 {
397 auto *request = static_cast<CurlRequestCore_ *>(userp);
398 request->onDataAvailable(data, size * nmemb);
399 return nmemb;
400}
CurlRequestCore_(const CurlRequestCore_ &)=delete

◆ onDataAvailable()

void uvco::CurlRequestCore_::onDataAvailable ( char * data,
size_t size )
inline

Called when data is available. Resumes the downloader coroutine.

263 {
264 BOOST_ASSERT(data != nullptr);
265 chunks_.emplace_back(data, size);
266 if (downloaderHandle_) {
267 auto handle = downloaderHandle_.value();
268 downloaderHandle_.reset();
269 Loop::enqueue(handle);
270 }
271 }
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94

◆ onError()

void uvco::CurlRequestCore_::onError ( uv_status status)
inlinenoexcept

Called when an error occurs, but also upon completion (then status == 0).

Resumes the downloader coroutine.

276 {
277 if (downloaderHandle_) {
278 auto handle = downloaderHandle_.value();
279 setUvStatus(status);
280 downloaderHandle_.reset();
281 Loop::enqueue(handle);
282 }
283 }
void setUvStatus(uv_status status) noexcept
Set socket error status.
Definition curl.cc:330

◆ operator=() [1/2]

CurlRequestCore_ & uvco::CurlRequestCore_::operator= ( const CurlRequestCore_ & )
delete

◆ operator=() [2/2]

CurlRequestCore_ & uvco::CurlRequestCore_::operator= ( CurlRequestCore_ && )
delete

◆ responseCode()

std::optional< long > uvco::CurlRequestCore_::responseCode ( ) const
inlinenodiscardnoexcept

Get HTTP response code. 0 if not set.

363 {
364 return responseCode_;
365 }

◆ setCurlStatus()

void uvco::CurlRequestCore_::setCurlStatus ( CURLcode status)
inlinenoexcept

Set Curl error code.

351 {
352 if (!curlStatus_) {
353 curlStatus_ = status;
354 }
355 }

◆ setResponseCode()

void uvco::CurlRequestCore_::setResponseCode ( long status)
inlinenoexcept

Set HTTP response code.

337 {
338 if (!responseCode_) {
339 responseCode_ = status;
340 }
341 }

◆ setUvStatus()

void uvco::CurlRequestCore_::setUvStatus ( uv_status status)
inlinenoexcept

Set socket error status.

330 {
331 if (!uvStatus_) {
332 uvStatus_ = status;
333 }
334 }

◆ setVerifyResult()

void uvco::CurlRequestCore_::setVerifyResult ( long result)
inlinenoexcept

Set SSL verification result.

344 {
345 if (!verifyResult_) {
346 verifyResult_ = result;
347 }
348 }

◆ url()

std::string_view uvco::CurlRequestCore_::url ( ) const
inlinenodiscardnoexcept

Get the URL of the request.

260{ return url_; }

◆ uvStatus()

std::optional< uv_status > uvco::CurlRequestCore_::uvStatus ( ) const
inlinenodiscardnoexcept

Get uv error status. 0 if success.

358 {
359 return uvStatus_;
360 }

◆ verifyResult()

std::optional< long > uvco::CurlRequestCore_::verifyResult ( ) const
inlinenodiscardnoexcept

Get SSL verification result. 0 means success, > 0 means failure.

368 {
369 return verifyResult_;
370 }

◆ CurlRequest

friend class CurlRequest
friend

Member Data Documentation

◆ chunks_

std::vector<std::string> uvco::CurlRequestCore_::chunks_
private

◆ context_

std::weak_ptr<UvCurlContext_> uvco::CurlRequestCore_::context_
private

◆ curlStatus_

std::optional<CURLcode> uvco::CurlRequestCore_::curlStatus_
private

◆ downloaderHandle_

std::optional<std::coroutine_handle<> > uvco::CurlRequestCore_::downloaderHandle_
private

◆ easyHandle_

CURL* uvco::CurlRequestCore_::easyHandle_
private

◆ payload_

std::optional<std::string> uvco::CurlRequestCore_::payload_
private

◆ responseCode_

std::optional<long> uvco::CurlRequestCore_::responseCode_
private

◆ url_

std::string uvco::CurlRequestCore_::url_
private

◆ uvStatus_

std::optional<uv_status> uvco::CurlRequestCore_::uvStatus_
private

◆ verifyResult_

std::optional<long> uvco::CurlRequestCore_::verifyResult_
private

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