rust-server - 課題

概要

Rustでマルチスレッド対応のHTTPサーバーを実装し、Web開発の基礎を学ぶ課題です。

マンダトリーパート

必須要件

  • HTTP/1.1 パーサー
- リクエストラインのパース - ヘッダーのパース - ボディの読み取り

  • ルーティング
- パスベースのルーティング - メソッド別ハンドラー

  • レスポンス生成
- ステータスコード - ヘッダー設定 - ボディ送信

  • 静的ファイル配信
- ファイルの読み込みと配信 - Content-Type の設定

インターフェース

pub struct Server {
    addr: SocketAddr,
    routes: Vec<Route>,
}

impl Server {
    pub fn new(addr: &str) -> Self;
    pub fn get(&mut self, path: &str, handler: Handler);
    pub fn post(&mut self, path: &str, handler: Handler);
    pub fn run(&self) -> Result<(), ServerError>;
}

pub struct Request {
    pub method: Method,
    pub path: String,
    pub headers: HashMap<String, String>,
    pub body: Vec<u8>,
}

pub struct Response {
    pub status: u16,
    pub headers: HashMap<String, String>,
    pub body: Vec<u8>,
}

type Handler = fn(Request) -> Response;

使用例

fn main() {
    let mut server = Server::new("127.0.0.1:8080");

    server.get("/", |_req| {
        Response::html("<h1>Hello, World!</h1>")
    });

    server.get("/api/data", |_req| {
        Response::json(r#"{"message": "OK"}"#)
    });

    server.post("/api/submit", |req| {
        let body = String::from_utf8_lossy(&req.body);
        Response::text(&format!("Received: {}", body))
    });

    server.run().unwrap();
}

ボーナスパート

ボーナス1: Keep-Alive

  • 持続的接続のサポート

ボーナス2: ミドルウェア

  • ロギング、認証などのミドルウェア

ボーナス3: WebSocket

  • WebSocketプロトコルの基本サポート
  • 提出要件

  • src/server.rs - サーバーコア
  • src/http.rs - HTTPパーサー
  • src/router.rs - ルーティング
  • src/response.rs - レスポンス生成
  • Cargo.toml
  • 制限事項

  • フレームワーク(actix, axum等)は使用不可
  • 標準ライブラリ + serde, serde_json のみ許可