use hyper::Method;
use crate::daemon::ca::{ta_handle, testbed_ca_handle};
use crate::daemon::http::server::{
api_add_pbl, api_ca_add_child, api_ca_child_remove, api_ca_parent_res_xml, api_remove_pbl,
api_repository_response_xml, render_ok, render_unknown_method,
};
use crate::daemon::http::{HttpResponse, Request, RequestPath, RoutingResult};
use crate::{commons::api::Handle, constants::ACTOR_DEF_TESTBED};
pub async fn testbed(mut req: Request) -> RoutingResult {
if !req.path().full().starts_with("/testbed") {
Err(req) } else if !req.state().read().await.testbed_enabled() {
render_unknown_method()
} else {
req.upgrade_from_anonymous(ACTOR_DEF_TESTBED).await;
let mut path = req.path().clone();
match path.next() {
Some("enabled") => testbed_enabled(req).await,
Some("children") => testbed_children(req, &mut path).await,
Some("publishers") => testbed_publishers(req, &mut path).await,
_ => render_unknown_method(),
}
}
}
async fn testbed_enabled(req: Request) -> RoutingResult {
match *req.method() {
Method::GET => render_ok(),
_ => render_unknown_method(),
}
}
async fn testbed_children(req: Request, path: &mut RequestPath) -> RoutingResult {
match (req.method().clone(), path.path_arg()) {
(Method::GET, Some(child)) => match path.next() {
Some("parent_response.xml") => api_ca_parent_res_xml(req, testbed_ca_handle(), child).await,
_ => render_unknown_method(),
},
(Method::DELETE, Some(child)) => api_ca_child_remove(req, testbed_ca_handle(), child).await,
(Method::POST, None) => api_ca_add_child(req, testbed_ca_handle()).await,
_ => render_unknown_method(),
}
}
async fn testbed_publishers(req: Request, path: &mut RequestPath) -> RoutingResult {
match (req.method().clone(), path.path_arg()) {
(Method::GET, Some(publisher)) => match path.next() {
Some("response.xml") => api_repository_response_xml(req, publisher).await,
_ => render_unknown_method(),
},
(Method::DELETE, Some(publisher)) => testbed_remove_pbl(req, publisher).await,
(Method::POST, None) => api_add_pbl(req).await,
_ => render_unknown_method(),
}
}
async fn testbed_remove_pbl(req: Request, publisher: Handle) -> RoutingResult {
if publisher == ta_handle() || publisher == testbed_ca_handle() {
Ok(HttpResponse::forbidden(format!(
"Publisher '{}' cannot be removed",
publisher
)))
} else {
api_remove_pbl(req, publisher).await
}
}