use candid::{CandidType, Deserialize};
use serde_bytes::ByteBuf;
mod test;
mod builder;
pub use builder::*;
#[derive(Clone, Debug, CandidType, Deserialize)]
pub struct HttpRequest {
pub method: String,
pub url: String,
pub headers: Vec<(String, String)>,
pub body: ByteBuf,
}
impl HttpRequest {
pub fn path(&self) -> &str {
match self.url.find('?') {
None => &self.url[..],
Some(index) => &self.url[..index],
}
}
pub fn raw_query_param(&self, param: &str) -> Option<&str> {
const QUERY_SEPARATOR: &str = "?";
let query_string = self.url.split(QUERY_SEPARATOR).nth(1)?;
if query_string.is_empty() {
return None;
}
const PARAMETER_SEPARATOR: &str = "&";
for chunk in query_string.split(PARAMETER_SEPARATOR) {
const KEY_VALUE_SEPARATOR: &str = "=";
let mut split = chunk.splitn(2, KEY_VALUE_SEPARATOR);
let name = split.next()?;
if name == param {
return Some(split.next().unwrap_or_default());
}
}
None
}
}