Skip to content

Commit

Permalink
Add example for autoreloading server development (#449)
Browse files Browse the repository at this point in the history
  • Loading branch information
akappel committed Feb 21, 2020
1 parent c58f12b commit 081b758
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
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();
}

0 comments on commit 081b758

Please sign in to comment.