topcoat_runtime/layer/
rerun.rs1use serde::Deserialize;
4use topcoat_core::{context::Cx, error::Result};
5use topcoat_router::{
6 Body, HeaderName, HeaderValue, Method,
7 content::Json,
8 error::rewrite,
9 header,
10 request::{FromRequest, headers, method, uri},
11 response::Response,
12};
13
14use crate::SignalValues;
15
16pub static RUNTIME_HEADER: HeaderName = HeaderName::from_static("x-topcoat-runtime");
21
22static RERUN: HeaderValue = HeaderValue::from_static("true");
24
25#[derive(Debug, Deserialize)]
27struct PageRerunRequest {
28 #[serde(default)]
29 signals: SignalValues,
30}
31
32pub(super) fn requested(cx: &Cx) -> bool {
34 *method(cx) == Method::POST && headers(cx).get(&RUNTIME_HEADER) == Some(&RERUN)
35}
36
37pub(super) async fn dispatch(cx: &Cx, body: Body) -> Result<Response> {
42 let Json(request) = Json::<PageRerunRequest>::from_request(cx, body).await?;
43
44 let mut headers = headers(cx).clone();
46 headers.remove(&RUNTIME_HEADER);
47 headers.remove(header::CONTENT_TYPE);
48 headers.remove(header::CONTENT_LENGTH);
49
50 let uri = uri(cx);
51 let target = uri
52 .path_and_query()
53 .map_or(uri.path(), |path_and_query| path_and_query.as_str());
54 Err(rewrite(target, Body::empty())
55 .method(Method::GET)
56 .headers(headers)
57 .with(request.signals)
58 .into())
59}