-
Notifications
You must be signed in to change notification settings - Fork 579
/
require_user_agent.rs
41 lines (36 loc) · 1.24 KB
/
require_user_agent.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//! Middleware that blocks requests with no user-agent header
use super::prelude::*;
use std::collections::HashMap;
use std::io::Cursor;
use util::request_header;
// Can't derive debug because of Handler.
#[allow(missing_debug_implementations)]
#[derive(Default)]
pub struct RequireUserAgent {
handler: Option<Box<dyn Handler>>,
}
impl AroundMiddleware for RequireUserAgent {
fn with_handler(&mut self, handler: Box<dyn Handler>) {
self.handler = Some(handler);
}
}
impl Handler for RequireUserAgent {
fn call(&self, req: &mut dyn Request) -> Result<Response, Box<dyn Error + Send>> {
let has_user_agent = request_header(req, "User-Agent") != "";
if !has_user_agent {
let body = format!(
include_str!("no_user_agent_message.txt"),
request_header(req, "X-Request-Id"),
);
let mut headers = HashMap::new();
headers.insert("Content-Length".to_string(), vec![body.len().to_string()]);
Ok(Response {
status: (403, "Forbidden"),
headers,
body: Box::new(Cursor::new(body.into_bytes())),
})
} else {
self.handler.as_ref().unwrap().call(req)
}
}
}