Fairings
Penjelasan
Fairing adalah jawaban Rocket untuk middleware — istilah ini sengaja dipilih tim Rocket (artinya "pelengkap perjalanan", merujuk metafora pesawat/roket) untuk menekankan bahwa fairing "menempel" pada siklus hidup aplikasi, bukan cuma membungkus satu request seperti `Layer` Tower di Axum. Fairing meng-implementasi trait `Fairing` dan bisa mengait ke beberapa titik siklus hidup: `on_ignite` (saat aplikasi start), `on_request` (sebelum handler dipanggil), `on_response` (sebelum response dikirim), dan `on_liftoff` (setelah server benar-benar mulai listen). Kamu bisa memilih mengimplementasikan hanya sebagian titik ini sesuai kebutuhan. Untuk kebutuhan logging sederhana, Rocket sendiri sudah punya logging bawaan yang otomatis aktif — fairing biasanya dipakai untuk kebutuhan lebih spesifik seperti menambahkan header keamanan ke semua response, mengukur waktu eksekusi request, atau memodifikasi response secara global.
Contoh Konsep
#[macro_use] extern crate rocket;
use rocket::fairing::{Fairing, Info, Kind};
use rocket::{Request, Response};
struct SecurityHeaders;
#[rocket::async_trait]
impl Fairing for SecurityHeaders {
fn info(&self) -> Info {
Info {
name: "Security Headers",
kind: Kind::Response,
}
}
async fn on_response<'r>(&self, _req: &'r Request<'_>, res: &mut Response<'r>) {
res.set_raw_header("X-Content-Type-Options", "nosniff");
}
}
#[get("/")]
fn hello() -> &'static str { "Hello!" }
#[launch]
fn rocket() -> _ {
rocket::build()
.attach(SecurityHeaders)
.mount("/", routes![hello])
}
Praktikum
Lengkapi fairing `RequestCounter` (versi sederhana) yang mencetak log setiap kali `on_request` dipanggil.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Pasang fairing dengan `.attach(...)` pada instance Rocket, mirip `.layer(...)` di Axum — tapi ingat urutan pemasangannya BERBEDA maknanya: fairing dijalankan sesuai urutan `Kind` (Ignite, Liftoff, Request, Response) dan urutan pemasangan dalam kategori yang sama, bukan bertumpuk dari luar ke dalam seperti Layer Tower di Axum.