Struct async_curl::actor::CurlActor

source ·
pub struct CurlActor<H>
where H: Handler + Debug + Send + 'static,
{ /* private fields */ }
Expand description

CurlActor is responsible for performing the contructed Easy2 object at the background to perform it asynchronously.

use async_curl::actor::CurlActor;
use curl::easy::{Easy2, Handler, WriteError};

#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
    data: Vec<u8>,
}

impl Handler for ResponseHandler {
    /// This will store the response from the server
    /// to the data vector.
    fn write(&mut self, data: &[u8]) -> Result<usize, WriteError> {
        self.data.extend_from_slice(data);
        Ok(data.len())
    }
}

impl ResponseHandler {
    /// Instantiation of the ResponseHandler
    /// and initialize the data vector.
    pub fn new() -> Self {
        Self::default()
    }

    /// This will consumed the object and
    /// give the data to the caller
    pub fn get_data(self) -> Vec<u8> {
        self.data
    }
}

let curl = CurlActor::new();
let mut easy2 = Easy2::new(ResponseHandler::new());

easy2.url("https://www.rust-lang.org").unwrap();
easy2.get(true).unwrap();

let response = curl.send_request(easy2).await.unwrap();
eprintln!("{:?}", response.get_ref());

Ok(())

Example for multiple request executed at the same time.

use async_curl::actor::CurlActor;
use curl::easy::{Easy2, Handler, WriteError};

#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
    data: Vec<u8>,
}

impl Handler for ResponseHandler {
    /// This will store the response from the server
    /// to the data vector.
    fn write(&mut self, data: &[u8]) -> Result<usize, WriteError> {
        self.data.extend_from_slice(data);
        Ok(data.len())
    }
}

impl ResponseHandler {
    /// Instantiation of the ResponseHandler
    /// and initialize the data vector.
    pub fn new() -> Self {
        Self::default()
    }

    /// This will consumed the object and
    /// give the data to the caller
    pub fn get_data(self) -> Vec<u8> {
        self.data
    }
}

let actor = CurlActor::new();
let mut easy2 = Easy2::new(ResponseHandler::new());
easy2.url("https://www.rust-lang.org").unwrap();
easy2.get(true).unwrap();

let actor1 = actor.clone();
let spawn1 = tokio::spawn(async move {
    let response = actor1.send_request(easy2).await;
    let mut response = response.unwrap();

    // Response body
    eprintln!(
        "Task 1 : {}",
        String::from_utf8_lossy(&response.get_ref().to_owned().get_data())
    );
    // Response status code
    let status_code = response.response_code().unwrap();
    eprintln!("Task 1 : {}", status_code);
});

let mut easy2 = Easy2::new(ResponseHandler::new());
easy2.url("https://www.rust-lang.org").unwrap();
easy2.get(true).unwrap();

let spawn2 = tokio::spawn(async move {
    let response = actor.send_request(easy2).await;
    let mut response = response.unwrap();

    // Response body
    eprintln!(
        "Task 2 : {}",
        String::from_utf8_lossy(&response.get_ref().to_owned().get_data())
    );
    // Response status code
    let status_code = response.response_code().unwrap();
    eprintln!("Task 2 : {}", status_code);
});
let (_, _) = tokio::join!(spawn1, spawn2);

Ok(())

Implementations§

source§

impl<H> CurlActor<H>
where H: Handler + Debug + Send + 'static,

source

pub fn new() -> Self

This creates the new instance of CurlActor to handle Curl perform asynchronously using Curl Multi in a background thread to avoid blocking of other tasks.

source

pub async fn send_request(&self, easy2: Easy2<H>) -> Result<Easy2<H>, Error<H>>
where H: Handler + Debug + Send + 'static,

This will send Easy2 into the background task that will perform curl asynchronously, await the response in the oneshot receiver and return Easy2 back to the caller.

Trait Implementations§

source§

impl<H> Clone for CurlActor<H>
where H: Handler + Debug + Send + 'static + Clone,

source§

fn clone(&self) -> CurlActor<H>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<H> Default for CurlActor<H>
where H: Handler + Debug + Send + 'static,

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<H> !RefUnwindSafe for CurlActor<H>

§

impl<H> Send for CurlActor<H>

§

impl<H> Sync for CurlActor<H>

§

impl<H> Unpin for CurlActor<H>

§

impl<H> !UnwindSafe for CurlActor<H>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.