rust-server - 課題
概要
Rustでマルチスレッド対応のHTTPサーバーを実装し、Web開発の基礎を学ぶ課題です。
マンダトリーパート
必須要件
- HTTP/1.1 パーサー
- ルーティング
- レスポンス生成
- 静的ファイル配信
インターフェース
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のみ許可