Skip to content

Instantly share code, notes, and snippets.

@masakielastic
Last active August 22, 2025 09:31
Show Gist options
  • Select an option

  • Save masakielastic/ec6cec0bdd1b19356500cc4b1a5b04df to your computer and use it in GitHub Desktop.

Select an option

Save masakielastic/ec6cec0bdd1b19356500cc4b1a5b04df to your computer and use it in GitHub Desktop.

warp v0.4 で HTTP/1 サーバー (Filter からサービスの作成)

構成

  • Cargo.tmol
  • src/main.rs

実行

cargo run を実行します。 ブラウザーや curl でアクセスします。

curl -v http://localhost:3000/

JSON の出力

cargo add serde_json を実行して serde_json を追加します。

[package]
name = "hyper"
version = "0.1.0"
edition = "2021"
[dependencies]
hyper = { version = "1", features = ["full"] }
tokio = { version = "1", features = ["full"] }
hyper-util = { version = "0.1", features = ["full"] }
warp = { version = "0.4", default-features = false }
use std::net::SocketAddr;
use hyper::server::conn::http1;
use hyper_util::rt::TokioIo;
use hyper_util::service::TowerToHyperService;
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let routes = warp::any().map(|| "Hello, World!".to_string());
let tower_svc = warp::service(routes);
let hyper_svc = TowerToHyperService::new(tower_svc);
let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
let listener = TcpListener::bind(addr).await?;
println!("listening on http://{addr}");
loop {
let (stream, _peer) = listener.accept().await?;
let io = TokioIo::new(stream);
let svc = hyper_svc.clone();
tokio::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(io, svc)
.await
{
eprintln!("error serving connection: {err}");
}
});
}
}
use std::net::SocketAddr;
use hyper::server::conn::http1;
use hyper_util::rt::TokioIo;
use hyper_util::service::TowerToHyperService;
use tokio::net::TcpListener;
use warp::{Filter, reply};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let html_route = warp::path("html")
.map(|| reply::html("<h1>Hello, Warp!</h1>".to_string()));
let json_route = warp::path("json").map(|| {
let obj = json!({
"message": "Hello, Warp!",
"lang": "rust",
"version": "0.4"
});
reply::json(&obj)
});
let routes = html_route.or(json_route);
let tower_svc = warp::service(routes);
let hyper_svc = TowerToHyperService::new(tower_svc);
let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
let listener = TcpListener::bind(addr).await?;
println!("listening on http://{addr}");
loop {
let (stream, _peer) = listener.accept().await?;
let io = TokioIo::new(stream);
let svc = hyper_svc.clone(); // 各コネクション用にクローン
tokio::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(io, svc)
.await
{
eprintln!("error serving connection: {err}");
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment