pub struct CurlActor<H>{ /* private fields */ }
Expand description
CurlActor is responsible for performing the contructed Easy2 object at the background to perform it asynchronously.
use async_curl::actor::{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::{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§
Trait Implementations§
Source§impl<H> Actor<H> for CurlActor<H>
impl<H> Actor<H> for CurlActor<H>
Source§fn send_request<'life0, 'async_trait>(
&'life0 self,
easy2: Easy2<H>,
) -> Pin<Box<dyn Future<Output = Result<Easy2<H>, Error<H>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn send_request<'life0, 'async_trait>(
&'life0 self,
easy2: Easy2<H>,
) -> Pin<Box<dyn Future<Output = Result<Easy2<H>, Error<H>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
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.
Auto Trait Implementations§
impl<H> Freeze for CurlActor<H>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more