Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide example on how to use hyper 1.0.0 with tower layers #3154

Open
o-agassizii opened this issue Mar 1, 2023 · 7 comments
Open

Provide example on how to use hyper 1.0.0 with tower layers #3154

o-agassizii opened this issue Mar 1, 2023 · 7 comments
Labels
A-docs Area: documentation. E-easy Effort: easy. A task that would be a great starting point for a new contributor.

Comments

@o-agassizii
Copy link

o-agassizii commented Mar 1, 2023

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 o-agassizii added the C-bug Category: bug. Something is wrong. This is bad! label Mar 1, 2023
@o-agassizii
Copy link
Author

Anyone? @seanmonstar

@seanmonstar
Copy link
Member

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

@o-agassizii
Copy link
Author

o-agassizii commented Mar 31, 2023

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.

@seanmonstar seanmonstar added A-docs Area: documentation. E-easy Effort: easy. A task that would be a great starting point for a new contributor. and removed C-bug Category: bug. Something is wrong. This is bad! labels Apr 28, 2023
@Wesley-Arizio
Copy link

Wesley-Arizio commented Nov 26, 2023

@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).

@NewbMiao
Copy link

NewbMiao commented Feb 1, 2024

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

@seanmonstar
Copy link
Member

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.

@NewbMiao
Copy link

NewbMiao commented Feb 2, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-docs Area: documentation. E-easy Effort: easy. A task that would be a great starting point for a new contributor.
Projects
None yet
Development

No branches or pull requests

4 participants