use crate::body::JsBody;
use crate::response::headermap_from_js;
use http::{HeaderMap, Method, Uri};
use multistore::route_handler::RequestInfo;
pub struct RequestParts {
pub method: Method,
pub path: String,
pub query: Option<String>,
pub headers: HeaderMap,
}
impl RequestParts {
pub fn from_web_sys(req: &web_sys::Request) -> Result<(Self, JsBody), String> {
let body = JsBody::new(req.body());
let method: Method = req
.method()
.parse()
.map_err(|e| format!("invalid method: {e}"))?;
let uri: Uri = req.url().parse().map_err(|e| format!("invalid URL: {e}"))?;
let path = percent_encoding::percent_decode_str(uri.path())
.decode_utf8_lossy()
.to_string();
let query = uri.query().map(|q| q.to_string());
let headers = headermap_from_js(&req.headers());
Ok((
Self {
method,
path,
query,
headers,
},
body,
))
}
pub fn as_request_info(&self) -> RequestInfo<'_> {
RequestInfo::new(
&self.method,
&self.path,
self.query.as_deref(),
&self.headers,
None,
)
}
}