use indexmap::IndexMap;
use thiserror::Error;
use crate::util::Utf16String;
pub trait IWebRequest: Send + Sync {
fn get_method(&self) -> Option<Utf16String>;
fn is_secure(&self) -> bool {
self.get_scheme()
.is_some_and(|scheme| scheme.to_string_lossy().eq_ignore_ascii_case("https"))
}
fn get_scheme(&self) -> Option<Utf16String>;
fn get_server_name(&self) -> Option<Utf16String>;
fn get_server_port(&self) -> Option<i32>;
fn get_application_path(&self) -> Option<Utf16String>;
fn get_path_within_application(&self) -> Option<Utf16String>;
fn get_query_string(&self) -> Option<Utf16String>;
fn get_request_path(&self) -> Utf16String {
let mut utf16 = self
.get_application_path()
.map_or_else(Vec::new, |value| value.as_utf16().to_vec());
if let Some(value) = self.get_path_within_application() {
utf16.extend_from_slice(value.as_utf16());
}
Utf16String::from_utf16(utf16)
}
fn get_request_url(&self) -> Result<Utf16String, WebRequestError> {
let scheme = self.get_scheme();
let server_name = self.get_server_name();
let server_port = self.get_server_port();
let request_path = self.get_request_path();
let query_string = self.get_query_string();
let (Some(scheme), Some(server_name), Some(server_port)) =
(scheme, server_name, server_port)
else {
return Err(WebRequestError::UnsupportedOperation {
message: "Request scheme, server name or port are null in this environment. Cannot compute request URL",
});
};
let scheme_text = scheme.to_string_lossy();
let default_port = (scheme_text == "http" && server_port == 80)
|| (scheme_text == "https" && server_port == 443);
let mut result = scheme.as_utf16().to_vec();
result.extend_from_slice(&[b':' as u16, b'/' as u16, b'/' as u16]);
result.extend_from_slice(server_name.as_utf16());
if !default_port {
result.push(b':' as u16);
result.extend(server_port.to_string().encode_utf16());
}
result.extend_from_slice(request_path.as_utf16());
if let Some(query_string) = query_string {
result.push(b'?' as u16);
result.extend_from_slice(query_string.as_utf16());
}
Ok(Utf16String::from_utf16(result))
}
fn contains_header(&self, name: Option<&Utf16String>) -> bool;
fn get_header_count(&self) -> i32;
fn get_all_header_names(&self) -> Vec<Option<Utf16String>>;
fn get_header_map(&self) -> IndexMap<Option<Utf16String>, Option<Vec<Option<Utf16String>>>>;
fn get_header_value(&self, name: Option<&Utf16String>) -> Option<Utf16String> {
self.get_header_values(name)
.and_then(|values| values.into_iter().next().flatten())
}
fn get_header_values(&self, name: Option<&Utf16String>) -> Option<Vec<Option<Utf16String>>>;
fn contains_parameter(&self, name: Option<&Utf16String>) -> bool;
fn get_parameter_count(&self) -> i32;
fn get_all_parameter_names(&self) -> Vec<Option<Utf16String>>;
fn get_parameter_map(&self) -> IndexMap<Option<Utf16String>, Option<Vec<Option<Utf16String>>>>;
fn get_parameter_value(&self, name: Option<&Utf16String>) -> Option<Utf16String> {
self.get_parameter_values(name)
.and_then(|values| values.into_iter().next().flatten())
}
fn get_parameter_values(&self, name: Option<&Utf16String>) -> Option<Vec<Option<Utf16String>>>;
fn contains_cookie(&self, name: Option<&Utf16String>) -> bool;
fn get_cookie_count(&self) -> i32;
fn get_all_cookie_names(&self) -> Vec<Option<Utf16String>>;
fn get_cookie_map(&self) -> IndexMap<Option<Utf16String>, Option<Vec<Option<Utf16String>>>>;
fn get_cookie_value(&self, name: Option<&Utf16String>) -> Option<Utf16String> {
self.get_cookie_values(name)
.and_then(|values| values.into_iter().next().flatten())
}
fn get_cookie_values(&self, name: Option<&Utf16String>) -> Option<Vec<Option<Utf16String>>>;
}
#[derive(Debug, Error, PartialEq, Eq)]
pub enum WebRequestError {
#[error("{message}")]
UnsupportedOperation {
message: &'static str,
},
}