actix / actix-web

Actix Web is a powerful, pragmatic, and extremely fast web framework for Rust.
https://actix.rs
Apache License 2.0
20.86k stars 1.64k forks source link

Build error with AWC 3.0.1 in client::h1proto #2873

Open koalabi opened 1 year ago

koalabi commented 1 year ago

When trying to build a sample application from a book's source code, I get a build error in h1proto for which the diagnostic is correct (no "feed" mathod in Pin) but I see no direct alternative nor any mention of breaking change in AWC history. Regressing to AWC 3.0.0 doesn't provide any relief. The book code is being migrated from a previous version of actix_web, so having to use AWC is new but the problem is not with the application code but with the AWC code itself

(excerpt from cargo check output):

    Checking awc v3.0.1
error[E0599]: no method named `feed` found for struct `Pin<&mut Framed<H1Connection<Io>, ClientCodec>>` in the current scope
   --> /home/alain/.cargo/registry/src/github.com-1ecc6299db9ec823/awc-3.0.1/src/client/h1proto.rs:100:20
    |
100 |         pin_framed.feed((head, body.size()).into()).await?;
    |                    ^^^^ method not found in `Pin<&mut Framed<H1Connection<Io>, ClientCodec>>`

For more information about this error, try `rustc --explain E0599`.

Expected Behavior

Normal compilation (as it is pristine crate code and a dependency of the app code) Indeed, "feed" seems to be no method (anymore) of Pin ...

Current Behavior

Compilation fails with message above

Possible Solution

The rest of the book so far has been updated to the last Actix version; so, using a previous version is no option and wouldn't make sense.

Steps to Reproduce (for bugs)

Just use AWC Client as in the following application function

async fn handle_get_tutors(tmpl: web::Data<tera::Tera>) -> Result<HttpResponse, Error> {
    let client = Client::new(); // Client::default();

    // Create request builder and send request

    let response = client
        .get("http://localhost:3000/tutors/")
        .send() // <- Send request
        .await
        .unwrap()
        .body()
        .await
        .unwrap();

    let str_list = std::str::from_utf8(&response.as_ref()).unwrap();
    let tutor_list: Vec<Tutor> = serde_json::from_str(str_list).unwrap();
    let mut ctx = tera::Context::new();

    ctx.insert("tutors", &tutor_list);
    let s = tmpl
        .render("list.html", &ctx)
        .map_err(|_| error::ErrorInternalServerError("Template error"))?;

    Ok(HttpResponse::Ok().content_type("text/html").body(s))
}

Context

Updating book source code from actix_web 3.3 to 4.0.1. App used actix_web::client::Client; which has now disappeared and, according to StackOverflow, awc has now to be used directly.

Your Environment

robjtede commented 1 year ago

Not able to reproduce: https://www.rustexplorer.com/b/eo7ndv

Are you compiling with custom crate features?