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

Add example for autoreloading server development #449

Merged
merged 4 commits into from Feb 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Expand Up @@ -43,6 +43,7 @@ pretty_env_logger = "0.3"
serde_derive = "1.0"
handlebars = "3.0.0"
tokio = { version = "0.2", features = ["macros"] }
listenfd = "0.3"

[features]
default = ["multipart", "websocket"]
Expand Down
4 changes: 4 additions & 0 deletions examples/README.md
Expand Up @@ -35,3 +35,7 @@ Hooray! `warp` also includes built-in support for WebSockets
### TLS

- [`tls.rs`](./tls.rs) - can i haz security?

### Autoreloading

- [`autoreload.rs`](./autoreload.rs) - Change some code and watch the server reload automatically!
38 changes: 38 additions & 0 deletions examples/autoreload.rs
@@ -0,0 +1,38 @@
#![deny(warnings)]
use hyper::server::Server;
use listenfd::ListenFd;
use std::convert::Infallible;
use warp::Filter;

extern crate listenfd;
/// You'll need to install `systemfd` and `cargo-watch`:
/// ```
/// cargo install systemfd cargo-watch
/// ```
/// And run with:
/// ```
/// systemfd --no-pid -s http::3030 -- cargo watch -x 'run --example autoreload'
/// ```
#[tokio::main]
async fn main() {
// Match any request and return hello world!
let routes = warp::any().map(|| "Hello, World!");

// hyper let's us build a server from a TcpListener (which will be
// useful shortly). Thus, we'll need to convert our `warp::Filter` into
// a `hyper::service::MakeService` for use with a `hyper::server::Server`.
let svc = warp::service(routes);
let make_svc = hyper::service::make_service_fn(|_: _| async move { Ok::<_, Infallible>(svc) });

let mut listenfd = ListenFd::from_env();
// if listenfd doesn't take a TcpListener (i.e. we're not running via
// the command above), we fall back to explicitly binding to a given
// host:port.
let server = if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
Server::from_tcp(l).unwrap()
} else {
Server::bind(&([127, 0, 0, 1], 3030).into())
};

server.serve(make_svc).await.unwrap();
}