Add ratelimiting example
Was really supposed to add this earlier but I forgot about it. Oopsgemtext
parent
349f6da698
commit
d5f213b270
|
@ -0,0 +1,39 @@
|
|||
use anyhow::*;
|
||||
use futures_core::future::BoxFuture;
|
||||
use futures_util::FutureExt;
|
||||
use log::LevelFilter;
|
||||
use northstar::{Server, Request, Response, GEMINI_PORT, Document};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
env_logger::builder()
|
||||
.filter_module("northstar", LevelFilter::Debug)
|
||||
.init();
|
||||
|
||||
let two = std::num::NonZeroU32::new(2).unwrap();
|
||||
|
||||
Server::bind(("localhost", GEMINI_PORT))
|
||||
.add_route("/", handle_request)
|
||||
.rate_limit("/limit", northstar::Quota::per_minute(two))
|
||||
.serve()
|
||||
.await
|
||||
}
|
||||
|
||||
fn handle_request(request: Request) -> BoxFuture<'static, Result<Response>> {
|
||||
async move {
|
||||
let mut document = Document::new();
|
||||
|
||||
if let Some("limit") = request.trailing_segments().get(0).map(String::as_str) {
|
||||
document.add_text("You're on a rate limited page!")
|
||||
.add_text("You can only access this page twice per minute");
|
||||
} else {
|
||||
document.add_text("You're on a normal page!")
|
||||
.add_text("You can access this page as much as you like.");
|
||||
}
|
||||
document.add_blank_line()
|
||||
.add_link("/limit", "Go to rate limited page")
|
||||
.add_link("/", "Go to a page that's not rate limited");
|
||||
Ok(Response::document(document))
|
||||
}
|
||||
.boxed()
|
||||
}
|
Loading…
Reference in New Issue