hyper icon indicating copy to clipboard operation
hyper copied to clipboard

Provide example on how to use hyper 1.0.0 with tower layers

Open o-agassizii opened this issue 2 years ago • 7 comments

Version 1.0.0-rc.3

Platform Not relevant

Description Can some of the examples for hyper 1.0.0 show how to make use of tower layers with hyper 1.0.0-rc.3?

All of the examples I can find online where people are using older versions of hyper with tower rely on the higher level Server API.

How do you use the lower level hyper 1.0.0 API like in https://hyper.rs/guides/1/server/hello-world/

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));

    // We create a TcpListener and bind it to 127.0.0.1:3000
    let listener = TcpListener::bind(addr).await?;

    // We start a loop to continuously accept incoming connections
    loop {
        let (stream, _) = listener.accept().await?;

        // Spawn a tokio task to serve multiple connections concurrently
        tokio::task::spawn(async move {
            // Finally, we bind the incoming connection to our `hello` service
            if let Err(err) = http1::Builder::new()
                // `service_fn` converts our function in a `Service`
                .serve_connection(stream, service_fn(hello))
                .await
            {
                println!("Error serving connection: {:?}", err);
            }
        });
    }
}

with tower layers?

o-agassizii avatar Mar 01 '23 23:03 o-agassizii

Anyone? @seanmonstar

o-agassizii avatar Mar 16 '23 10:03 o-agassizii

What have you tried so far? Where do you get stumped? The code you pasted is the hello world example.

seanmonstar avatar Mar 16 '23 14:03 seanmonstar

I tried a bunch of things, all too convoluted to meaningfully describe here.

This is why I request that a super basic example is provided showing how tower layers can be combined with the lower level hello world example.

o-agassizii avatar Mar 31 '23 09:03 o-agassizii

@seanmonstar @o-agassizii I have this repo with an example of an implementation of tower layer in hyper server https://github.com/Wesley-Arizio/hyper-tower, there is some stuff I need to improve but I think it's a good start.

if you guys find that is a good solution I can open a PR with this example or if you have suggestions I can implement them (or at least try to).

Wesley-Arizio avatar Nov 26 '23 02:11 Wesley-Arizio

Now hyper not relies on tower::service, so it's a bit annoying hard to reuse layer from tower::http. if other web framwork upgrade to latest hyper, would have same issue. right? feel like it's a pity to get rid of tower service

NewbMiao avatar Feb 01 '24 15:02 NewbMiao

There's an adapter available in https://docs.rs/hyper-util/latest/hyper_util/service/struct.TowerToHyperService.html

There's also an item in #3411 to add a middleware section to the guides, if anyone would like to start that.

seanmonstar avatar Feb 01 '24 16:02 seanmonstar

Cool, @seanmonstar I've had a play with the TowerToHyperService.html and also raised a PR with examples for middleware docs.

NewbMiao avatar Feb 02 '24 08:02 NewbMiao