uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Static Private Member Functions | Private Attributes | Friends | List of all members
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
191 : context_{std::move(ctx)}, easyHandle_{curl_easy_init()} {}
std::weak_ptr< UvCurlContext_ > context_
Definition curl.cc:362
CURL * easyHandle_
Definition curl.cc:363

◆ CurlRequestCore_() [4/4]

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

Construct and initialize download.

195 : context_{std::move(ctx)}, easyHandle_(curl_easy_init()) {
196 initGet(std::move(url));
197 }
std::string_view url() const noexcept
Get the URL of the request.
Definition curl.cc:242
void initGet(std::string url)
Definition curl.cc:224

◆ ~CurlRequestCore_()

uvco::CurlRequestCore_::~CurlRequestCore_ ( )
inline
199 {
200 curl_easy_cleanup(easyHandle_);
201 if (!context_.expired()) {
202 context_.lock()->removeHandle(easyHandle_);
203 }
204 easyHandle_ = nullptr;
205 }

Member Function Documentation

◆ await_ready()

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

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

271 {
272 BOOST_ASSERT_MSG(!context_.expired(),
273 "Curl object must outlive any request");
274 // Before checking response code, ensure that it's up-to-date.
275 context_.lock()->checkCurlInfo();
276 return !chunks_.empty() || responseCode_ > 0;
277 }
std::vector< std::string > chunks_
Definition curl.cc:370
std::optional< long > responseCode_
Definition curl.cc:373

◆ await_resume()

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

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

287 {
288 if (uvStatus_ && *uvStatus_ != 0) {
289 return std::nullopt;
290 }
291 if (verifyResult_ && *verifyResult_ != 0) {
292 // SSL verification to be checked by downloader.
293 return std::nullopt;
294 }
295 if (responseCode_ && *responseCode_ != 200) {
296 // HTTP Status to be checked by downloader.
297 return std::nullopt;
298 }
299 if (!chunks_.empty()) {
300 std::string thisResult = std::move(chunks_.front());
301 chunks_.erase(chunks_.begin());
302 return std::move(thisResult);
303 }
304
305 // Signal end of stream.
306 return std::nullopt;
307 }
std::optional< long > verifyResult_
Definition curl.cc:374
std::optional< uv_status > uvStatus_
Definition curl.cc:371

◆ await_suspend()

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

Awaiter protocol: suspend the downloader coroutine.

280 {
281 BOOST_ASSERT(!downloaderHandle_);
282 downloaderHandle_ = handle;
283 return true;
284 }
std::optional< std::coroutine_handle<> > downloaderHandle_
Definition curl.cc:367

◆ curlStatus()

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

Get Curl error code once the request has finished.

355 {
356 return curlStatus_;
357 }
std::optional< CURLcode > curlStatus_
Definition curl.cc:372

◆ initCommon()

void uvco::CurlRequestCore_::initCommon ( std::string  url)
inline
207 {
208 BOOST_ASSERT(easyHandle_ != nullptr);
209 BOOST_ASSERT_MSG(url_.empty(), "cannot work with empty URL");
210 BOOST_ASSERT_MSG(!context_.expired(),
211 "Curl object must outlive any request");
212
213 url_ = std::move(url);
214 // Configure easy handle and initiate download.
215 curl_easy_setopt(easyHandle_, CURLOPT_URL, url_.data());
216 curl_easy_setopt(easyHandle_, CURLOPT_WRITEFUNCTION, onCurlDataAvailable);
217 // Set Write Data for use in onCurlDataAvailable.
218 curl_easy_setopt(easyHandle_, CURLOPT_WRITEDATA, this);
219 // Set private data for use in curlSocketFunction.
220 curl_easy_setopt(easyHandle_, CURLOPT_PRIVATE, this);
221 curl_easy_setopt(easyHandle_, CURLOPT_FOLLOWLOCATION, 1L);
222 }
static size_t onCurlDataAvailable(char *data, size_t size, size_t nmemb, void *userp)
Definition curl.cc:377
std::string url_
Definition curl.cc:365

◆ initGet()

void uvco::CurlRequestCore_::initGet ( std::string  url)
inline
224 {
225 initCommon(std::move(url));
226 context_.lock()->addHandle(easyHandle_);
227 }
void initCommon(std::string url)
Definition curl.cc:207

◆ initPost()

void uvco::CurlRequestCore_::initPost ( std::string  url,
std::span< const std::pair< std::string, std::string > >  fields 
)
inline
230 {
231 initCommon(std::move(url));
232 BOOST_ASSERT(!payload_);
233
234 // Must keep payload alive until request is done.
236 curl_easy_setopt(easyHandle_, CURLOPT_POST, 1L);
237 curl_easy_setopt(easyHandle_, CURLOPT_POSTFIELDS, payload_->c_str());
238 context_.lock()->addHandle(easyHandle_);
239 }
std::optional< std::string > payload_
Definition curl.cc:366
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
378 {
379 auto *request = static_cast<CurlRequestCore_ *>(userp);
380 request->onDataAvailable(data, size * nmemb);
381 return nmemb;
382}
CurlRequestCore_(const CurlRequestCore_ &)=delete

◆ onDataAvailable()

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

Called when data is available. Resumes the downloader coroutine.

245 {
246 BOOST_ASSERT(data != nullptr);
247 chunks_.emplace_back(data, size);
248 if (downloaderHandle_) {
249 auto handle = downloaderHandle_.value();
250 downloaderHandle_.reset();
251 Loop::enqueue(handle);
252 }
253 }
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73

◆ 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.

258 {
259 if (downloaderHandle_) {
260 auto handle = downloaderHandle_.value();
261 setUvStatus(status);
262 downloaderHandle_.reset();
263 Loop::enqueue(handle);
264 }
265 }
void setUvStatus(uv_status status) noexcept
Set socket error status.
Definition curl.cc:312

◆ 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
inlinenoexcept

Get HTTP response code. 0 if not set.

345 {
346 return responseCode_;
347 }

◆ setCurlStatus()

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

Set Curl error code.

333 {
334 if (!curlStatus_) {
335 curlStatus_ = status;
336 }
337 }

◆ setResponseCode()

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

Set HTTP response code.

319 {
320 if (!responseCode_) {
321 responseCode_ = status;
322 }
323 }

◆ setUvStatus()

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

Set socket error status.

312 {
313 if (!uvStatus_) {
314 uvStatus_ = status;
315 }
316 }

◆ setVerifyResult()

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

Set SSL verification result.

326 {
327 if (!verifyResult_) {
328 verifyResult_ = result;
329 }
330 }

◆ url()

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

Get the URL of the request.

242{ return url_; }

◆ uvStatus()

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

Get uv error status. 0 if success.

340 {
341 return uvStatus_;
342 }

◆ verifyResult()

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

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

350 {
351 return verifyResult_;
352 }

Friends And Related Symbol Documentation

◆ 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: