branch: main
main.rs
865 bytesRaw
use std::io;

use axum::{
    body::Body,
    extract::ws::{WebSocket, WebSocketUpgrade},
    response::Response,
    routing::{get, post},
    Router,
};
use tokio::net::TcpListener;

#[tokio::main]
async fn main() -> io::Result<()> {
    let router = Router::new()
        .route("/ping", get(|| async {}))
        .route("/echo", post(|b: Body| async { b }))
        .route("/ws", get(ws_handler));
    let listener = TcpListener::bind("0.0.0.0:8080").await?;
    axum::serve(listener, router).await?;
    Ok(())
}

async fn ws_handler(ws: WebSocketUpgrade) -> Response {
    ws.on_upgrade(handle_ws)
}

async fn handle_ws(mut ws: WebSocket) {
    while let Some(msg) = ws.recv().await {
        let msg = match msg {
            Ok(v) => v,
            Err(_) => return,
        };
        if ws.send(msg).await.is_err() {
            return;
        }
    }
}