use crate::*;
impl ResponseTrait for HttpResponseText {
type OutputText = HttpResponseText;
type OutputBinary = HttpResponseBinary;
fn from(response: &[u8]) -> Self::OutputText
where
Self: Sized,
{
<HttpResponseBinary as ResponseTrait>::from(response).text()
}
fn text(&self) -> Self::OutputText {
self.clone()
}
fn binary(&self) -> HttpResponseBinary {
let body: Vec<u8> = self
.body
.read()
.map_or(Vec::new(), |body| body.clone().into_bytes());
HttpResponseBinary {
http_version: self.http_version.clone(),
status_code: self.status_code,
status_text: self.status_text.clone(),
headers: self.headers.clone(),
body: Arc::new(RwLock::new(body)),
}
}
fn decode(&self, buffer_size: usize) -> HttpResponseBinary {
let http_response: HttpResponseText = self.clone();
let tmp_body: Vec<u8> = self
.body
.read()
.map_or(Vec::new(), |body| body.as_bytes().to_vec())
.to_vec();
let headers: HashMapXxHash3_64<String, String> =
self.headers
.read()
.map_or(hash_map_xx_hash3_64(), |headers_ref| {
let mut string_headers: HashMapXxHash3_64<String, String> =
hash_map_xx_hash3_64();
for (key, value_deque) in headers_ref.iter() {
if let Some(first_value) = value_deque.front() {
string_headers.insert(key.clone(), first_value.clone());
}
}
string_headers
});
let body: Vec<u8> = Compress::from(&headers)
.decode(&tmp_body, buffer_size)
.into_owned();
HttpResponseBinary {
http_version: http_response.http_version,
status_code: http_response.status_code,
status_text: http_response.status_text,
headers: http_response.headers,
body: Arc::new(RwLock::new(body)),
}
}
}
impl HttpResponseText {
pub fn get_http_version(&self) -> HttpVersion {
if let Ok(http_version) = self.http_version.read() {
return http_version
.to_string()
.parse::<HttpVersion>()
.unwrap_or_default();
}
HttpVersion::default()
}
pub fn get_status_code(&self) -> ResponseStatusCode {
self.status_code
}
pub fn get_status_text(&self) -> String {
if let Ok(status_text) = self.status_text.read() {
return status_text.to_string();
}
HttpStatus::Unknown.to_string()
}
pub fn get_headers(&self) -> ResponseHeaders {
if let Ok(headers) = self.headers.read() {
return headers.clone();
}
hash_map_xx_hash3_64()
}
pub fn get_body(&self) -> RequestBodyString {
if let Ok(body) = self.body.read() {
return body.to_string();
}
RequestBodyString::new()
}
}
impl Default for HttpResponseText {
#[inline(always)]
fn default() -> Self {
Self {
http_version: Arc::new(RwLock::new(HttpVersion::Unknown(String::new()))),
status_code: HttpStatus::Unknown.code(),
status_text: Arc::new(RwLock::new(HttpStatus::Unknown.to_string())),
headers: Arc::new(RwLock::new(hash_map_xx_hash3_64())),
body: Arc::new(RwLock::new(String::new())),
}
}
}