#async #curl #tokio

async-curl

An asynchronous implementation to perform curl operations with tokio

24 releases

new 0.3.5 Feb 17, 2024
0.2.8 Feb 7, 2024
0.2.4 Oct 29, 2023
0.1.6 May 15, 2023
0.1.3 Mar 26, 2023
Download history 225/week @ 2023-10-28 335/week @ 2023-11-04 272/week @ 2023-11-11 54/week @ 2023-11-18 76/week @ 2023-11-25 46/week @ 2023-12-02 23/week @ 2023-12-09 49/week @ 2023-12-16 63/week @ 2023-12-23 40/week @ 2023-12-30 79/week @ 2024-01-06 38/week @ 2024-01-13 61/week @ 2024-01-20 287/week @ 2024-01-27 513/week @ 2024-02-03 274/week @ 2024-02-10

1,144 downloads per month
Used in 2 crates

MIT license

125KB
1.5K SLoC

async-curl

This will perform curl Easy2 asynchronously for rust-lang via an Actor using tokio

Latest Version License Documentation Build Status

How to use with multiple async request

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);
}

Dependencies

~16–27MB
~385K SLoC