TPPZ
TPPZ

Reputation: 4901

Hyper cannot find Server module

I'm writing a "hello world" HTTP server with Hyper, however I am not able to find the Server and rt modules when trying to import them.

When invoking cargo run, then I see this error message:

26 |     let server = hyper::Server::bind(&addr).serve(router);
   |                         ^^^^^^ could not find `Server` in `hyper`

I must be missing something obvious about Rust and Hyper. What I am trying to do is writing something as dry/simple as possible with just the HTTP layer and some basic routes. I would like to include as little as possible 3rd party dependencies e.g avoiding Tokio which I think involves async behavior, but I am not sure about the context as I am new to Rust.

Looks like I must use futures, so I included this dependency and perhaps futures only work with the async reserved word (which I am not sure if it comes from Tokio or Rust itself).

What confuses me is that in the Hyper examples I do see imports like use hyper::{Body, Request, Response, Server};, so that Server thing must be there, somewhere.

These are the dependencies in Cargo.toml:

hyper = "0.14.12"
serde_json = "1.0.67"
futures = "0.3.17"

This is the code in main.rs:

use futures::future;
use hyper::service::service_fn;
use hyper::{Body, Method, Response, StatusCode};
use serde_json::json;

fn main() {
    let router = || {
        service_fn(|req| match (req.method(), req.uri().path()) {
            (&Method::GET, "/foo") => {
                let mut res = Response::new(
                    Body::from(json!({"message": "bar"}).to_string())
                );
                future::ok(res)
            },
            (_, _) => {
                let mut res = Response::new(
                    Body::from(json!({"content": "route not found"}).to_string())
                );
                *res.status_mut() = StatusCode::NOT_FOUND;
                future::ok(res)
            }
        })
    };

    let addr = "127.0.0.1:8080".parse::<std::net::SocketAddr>().unwrap();
    let server = hyper::Server::bind(&addr).serve(router); // <== this line fails to compile
    // hyper::rt::run(server.map_err(|e| {
    //     eprintln!("server error: {}", e);
    // }));
}

How do I make the code above compile and run?

Upvotes: 9

Views: 2739

Answers (1)

Netwave
Netwave

Reputation: 42796

According to documentation, you are missing one module namespace in your call hyper::server::Server:

let server = hyper::server::Server::bind(&addr).serve(router)

In order to use server you need to activate the feature flag in cargo:

hyper = { version = "0.14.12", features = ["server"] }

Upvotes: 5

Related Questions