ubnt-intrepid's blog

書いてあることがブログの内容です

Hyper 0.11用のルーティングライブラリを作った

IronでWebアプリを作っていたら「もういっそのことHyper直に触ったほうが楽なのでは」という悪魔のささやきが聞こえてきたので勢いで作ってみた。

github.com

基本的に 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 以前であればルーティング用のクレートはいくつか実装されているらしい