# async-curl
This will perform curl Easy2 asynchronously for rust-lang via an Actor using tokio
[](https://crates.io/crates/async-curl)
[](LICENSE)
[](https://docs.rs/async-curl)
[](https://github.com/LorenzoLeonardo/async-curl/actions)
[](https://crates.io/crates/async-curl)
## How to use with multiple async request
```rust
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
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
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 mut result = actor1.send_request(easy2).await.unwrap();
let response = result.get_ref().to_owned().get_data();
let status = result.response_code().unwrap();
println!("Response: {:?}", response);
println!("Status: {:?}", status);
});
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 mut result = actor.send_request(easy2).await.unwrap();
let response = result.get_ref().to_owned().get_data();
let status = result.response_code().unwrap();
println!("Response: {:?}", response);
println!("Status: {:?}", status);
});
let (_, _) = tokio::join!(spawn1, spawn2);
}
```
## Using AsyncCurl builder using Easy2 Curl perform
```rust
use async_curl::{AsyncCurl, CurlActor};
use curl::easy::{Handler, WriteError};
#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
data: Option<Vec<u8>>,
}
impl Handler for ResponseHandler {
/// This will store the response from the server
/// to the data vector.
fn write(&mut self, stream: &[u8]) -> Result<usize, WriteError> {
if self.data.is_none() {
self.data = Some(stream.to_vec());
} else {
if let Some(ref mut data) = self.data {
data.extend_from_slice(stream);
}
}
Ok(stream.len())
}
}
impl ResponseHandler {
/// Instantiation of the ResponseHandler
/// and initialize the data vector.
pub fn new() -> Self {
Self::default()
}
/// This will give the data to the receiving variable
pub fn take(&mut self) -> Option<Vec<u8>> {
self.data.take()
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
let actor = CurlActor::new();
let collector = ResponseHandler::new();
let mut curl = AsyncCurl::new(actor, collector)
.url("https://www.rust-lang.org/")
.unwrap()
.finalize()
.perform()
.await
.unwrap();
let body = curl.get_mut().take();
let status = curl.response_code().unwrap() as u16;
println!("Body: {:?}", body);
println!("Status: {status}");
}
```
## Using AsyncCurl builder using Easy2 Curl-Multi perform
```rust
use async_curl::{AsyncCurl, CurlActor};
use curl::easy::{Handler, WriteError};
#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
data: Option<Vec<u8>>,
}
impl Handler for ResponseHandler {
/// This will store the response from the server
/// to the data vector.
fn write(&mut self, stream: &[u8]) -> Result<usize, WriteError> {
if self.data.is_none() {
self.data = Some(stream.to_vec());
} else {
if let Some(ref mut data) = self.data {
data.extend_from_slice(stream);
}
}
Ok(stream.len())
}
}
impl ResponseHandler {
/// Instantiation of the ResponseHandler
/// and initialize the data vector.
pub fn new() -> Self {
Self::default()
}
/// This will give the data to the receiving variable
pub fn take(&mut self) -> Option<Vec<u8>> {
self.data.take()
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
let actor = CurlActor::new();
let collector = ResponseHandler::new();
let mut curl = AsyncCurl::new(actor, collector)
.url("https://www.rust-lang.org/")
.unwrap()
.finalize()
.use_multi_transfer()
.perform()
.await
.unwrap();
let body = curl.get_mut().take();
let status = curl.response_code().unwrap() as u16;
println!("Body: {:?}", body);
println!("Status: {status}");
}
```
## Supplying Tokio Runtime (current-thread)
```rust
use async_curl::{AsyncCurl, CurlActor};
use curl::easy::{Handler, WriteError};
use tokio::runtime::Builder;
#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
data: Option<Vec<u8>>,
}
impl Handler for ResponseHandler {
/// This will store the response from the server
/// to the data vector.
fn write(&mut self, stream: &[u8]) -> Result<usize, WriteError> {
if self.data.is_none() {
self.data = Some(stream.to_vec());
} else {
if let Some(ref mut data) = self.data {
data.extend_from_slice(stream);
}
}
Ok(stream.len())
}
}
impl ResponseHandler {
/// Instantiation of the ResponseHandler
/// and initialize the data vector.
pub fn new() -> Self {
Self::default()
}
/// This will give the data to the receiving variable
pub fn take(&mut self) -> Option<Vec<u8>> {
self.data.take()
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
let runtime = Builder::new_current_thread().enable_all().build().unwrap();
let actor = CurlActor::new_runtime(runtime);
let collector = ResponseHandler::new();
let mut curl = AsyncCurl::new(actor, collector)
.url("https://www.rust-lang.org/")
.unwrap()
.finalize()
.perform()
.await
.unwrap();
let body = curl.get_mut().take();
let status = curl.response_code().unwrap() as u16;
println!("Body: {:?}", body);
println!("Status: {status}");
}
```
## Supplying Tokio Runtime (multi-thread)
```rust
use async_curl::{AsyncCurl, CurlActor};
use curl::easy::{Handler, WriteError};
use tokio::runtime::Builder;
#[derive(Debug, Clone, Default)]
pub struct ResponseHandler {
data: Option<Vec<u8>>,
}
impl Handler for ResponseHandler {
/// This will store the response from the server
/// to the data vector.
fn write(&mut self, stream: &[u8]) -> Result<usize, WriteError> {
if self.data.is_none() {
self.data = Some(stream.to_vec());
} else {
if let Some(ref mut data) = self.data {
data.extend_from_slice(stream);
}
}
Ok(stream.len())
}
}
impl ResponseHandler {
/// Instantiation of the ResponseHandler
/// and initialize the data vector.
pub fn new() -> Self {
Self::default()
}
/// This will give the data to the receiving variable
pub fn take(&mut self) -> Option<Vec<u8>> {
self.data.take()
}
}
#[tokio::main(flavor = "multi_thread")]
async fn main() {
let runtime = Builder::new_multi_thread().enable_all().build().unwrap();
let actor = CurlActor::new_runtime(runtime);
let collector = ResponseHandler::new();
let mut curl = AsyncCurl::new(actor, collector)
.url("https://www.rust-lang.org/")
.unwrap()
.finalize()
.perform()
.await
.unwrap();
let body = curl.get_mut().take();
let status = curl.response_code().unwrap() as u16;
println!("Body: {:?}", body);
println!("Status: {status}");
}
```