use futures_util::{FutureExt, StreamExt};
use warp::Filter;
+// GET /hello/warp => 200 OK with body "Hello, warp!"
+async fn hello(name: String, agent: String) -> Result<impl warp::Reply, warp::Rejection> {
+ Ok(format!("Hello, {} from {}!", name, agent))
+}
+
+// websocat ws://127.0.0.1:3030/ws-echo
+async fn ws_echo_connected(websocket: warp::ws::WebSocket) {
+ // echo all messages back
+ let (tx, rx) = websocket.split();
+ rx.forward(tx).map(|result| {
+ if let Err(e) = result {
+ log::warn!("websocket error: {:?}", e);
+ }
+ }).await;
+}
+
#[tokio::main]
async fn main() {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
- // GET /hello/warp => 200 OK with body "Hello, warp!"
let hello = warp::path!("hello" / String)
.and(warp::header::<String>("user-agent"))
- .map(|name, agent| format!("Hello, {} from {}!", name, agent));
+ .and_then(hello);
- // websocat ws://127.0.0.1:3030/ws-echo
- let echo = warp::path("ws-echo")
+ let ws_echo = warp::path("ws-echo")
.and(warp::ws())
.map(|ws: warp::ws::Ws| {
- ws.on_upgrade(|websocket| {
- // echo all messages back
- let (tx, rx) = websocket.split();
- rx.forward(tx).map(|result| {
- if let Err(e) = result {
- log::warn!("websocket error: {:?}", e);
- }
- })
- })
+ ws.on_upgrade(|websocket| { ws_echo_connected(websocket) })
});
let api = hello
- .or(echo)
+ .or(ws_echo)
.with(warp::log("warp-server"));
warp::serve(api)