Hyper 0.11用のルーティングライブラリを作った
IronでWebアプリを作っていたら「もういっそのことHyper直に触ったほうが楽なのでは」という悪魔のささやきが聞こえてきたので勢いで作ってみた。
基本的に Iron のルーティング用ミドルウェアである router
と似たような使い勝手になるよう意識しているが,route-recognizer
ではなく正規表現でマッチする形式を採用した(route-recognizer
対応も後でする予定)。
リダイレクトや404ページなどの対応は今後少しずつ行っていきたい…
extern crate hyper; extern crate hyper_router; extern crate futures; extern crate regex; use hyper::server::{Http, Request, Response}; use hyper::{Method, StatusCode}; use hyper::Error as HyperError; use hyper_router::RouteBuilder; use futures::Future; use futures::future::{self, BoxFuture}; use regex::Captures; // 第2引数にマッチ結果が格納されている fn hello(_req: &Request, cap: &Captures) -> BoxFuture<Response, HyperError> { future::ok( Response::new() .with_status(StatusCode::Ok) .with_body(format!("Captures: {:?}", cap)), ).boxed() } fn main() { let router = RouteBuilder::default() .route(Method::Get, r"/([^/]+)", hello) .finish(); let addr = "0.0.0.0:4000".parse().unwrap(); let server = Http::new().bind(&addr, router).unwrap(); server.run().unwrap(); }
こういう思い付きで雑に作ったものを放置する癖を何とかしないといけない…
※ hyper
0.10 以前であればルーティング用のクレートはいくつか実装されているらしい