use crate::agent::Unit; use crate::error::Error; use crate::stream::Stream; use lazy_static::lazy_static; use std::collections::HashMap; use std::io::{Cursor, Write}; use std::sync::{Arc, Mutex}; mod agent_test; mod auth; mod body_read; mod body_send; mod query_string; mod range; mod simple; type RequestHandler = Fn(&Unit) -> Result + Send + 'static; lazy_static! { pub static ref TEST_HANDLERS: Arc>>> = { Arc::new(Mutex::new(HashMap::new())) }; } pub fn set_handler(path: &str, handler: H) where H: Fn(&Unit) -> Result + Send + 'static, { let mut handlers = TEST_HANDLERS.lock().unwrap(); handlers.insert(path.to_string(), Box::new(handler)); } pub fn make_response( status: u16, status_text: &str, headers: Vec<&str>, mut body: Vec, ) -> Result { let mut buf: Vec = vec![]; write!(&mut buf, "HTTP/1.1 {} {}\r\n", status, status_text).ok(); for hstr in headers.iter() { write!(&mut buf, "{}\r\n", hstr).ok(); } write!(&mut buf, "\r\n").ok(); buf.append(&mut body); let cursor = Cursor::new(buf); let write: Vec = vec![]; Ok(Stream::Test(Box::new(cursor), write)) } pub fn resolve_handler(unit: &Unit) -> Result { let mut handlers = TEST_HANDLERS.lock().unwrap(); let path = unit.url.path(); let handler = handlers.remove(path).unwrap(); handler(unit) }