From 1d60db70c91d4ca0e8e4b000ab789041b1f51db2 Mon Sep 17 00:00:00 2001 From: yggverse Date: Mon, 24 Feb 2025 02:54:18 +0200 Subject: [PATCH] use separated mod for system tools --- src/lib.rs | 24 +------------------ src/request/gemini.rs | 2 +- src/request/titan/meta.rs | 2 +- src/response/certificate/expected.rs | 2 +- src/response/certificate/not_authorized.rs | 2 +- src/response/certificate/not_valid.rs | 2 +- src/response/failure/permanent/bad_request.rs | 2 +- src/response/failure/permanent/general.rs | 2 +- src/response/failure/permanent/gone.rs | 2 +- src/response/failure/permanent/not_found.rs | 2 +- .../permanent/proxy_request_refused.rs | 2 +- src/response/failure/temporary/cgi_error.rs | 2 +- src/response/failure/temporary/general.rs | 2 +- src/response/failure/temporary/proxy_error.rs | 2 +- .../failure/temporary/server_unavailable.rs | 2 +- src/response/failure/temporary/slow_down.rs | 2 +- src/response/input/default.rs | 2 +- src/response/input/sensitive.rs | 2 +- src/response/redirect/permanent.rs | 2 +- src/response/redirect/temporary.rs | 2 +- src/response/success/default/meta.rs | 2 +- src/tool.rs | 23 ++++++++++++++++++ 22 files changed, 44 insertions(+), 43 deletions(-) create mode 100644 src/tool.rs diff --git a/src/lib.rs b/src/lib.rs index bd7e052..150c49f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,26 +6,4 @@ pub use response::Response; pub const HEADER_MAX_LEN: usize = 1024; -trait Header { - fn header_bytes(&self) -> Result<&[u8]>; -} - -impl Header for &[u8] { - fn header_bytes(&self) -> Result<&[u8]> { - match self.iter().position(|&b| b == b'\r') { - Some(n) => { - if n > HEADER_MAX_LEN { - bail!("Header bytes length reached") - } - if self.get(n + 1).is_some_and(|&b| b == b'\n') { - Ok(&self[..n]) - } else { - bail!("LF byte not found") - } - } - None => bail!("CR byte not found"), - } - } -} - -use anyhow::{bail, Result}; +mod tool; diff --git a/src/request/gemini.rs b/src/request/gemini.rs index 02b10bc..59502e7 100644 --- a/src/request/gemini.rs +++ b/src/request/gemini.rs @@ -8,7 +8,7 @@ pub struct Gemini { impl Gemini { pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; Ok(Self { url: Url::parse(std::str::from_utf8(buffer.header_bytes()?)?)?, }) diff --git a/src/request/titan/meta.rs b/src/request/titan/meta.rs index be9b001..48f4bb6 100644 --- a/src/request/titan/meta.rs +++ b/src/request/titan/meta.rs @@ -8,7 +8,7 @@ pub struct Meta { impl Meta { pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; use regex::Regex; let header = from_utf8(buffer.header_bytes()?)?; Ok(Self { diff --git a/src/response/certificate/expected.rs b/src/response/certificate/expected.rs index 413915e..300e016 100644 --- a/src/response/certificate/expected.rs +++ b/src/response/certificate/expected.rs @@ -11,7 +11,7 @@ impl Expected { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/certificate/not_authorized.rs b/src/response/certificate/not_authorized.rs index bdba158..e5a2d5e 100644 --- a/src/response/certificate/not_authorized.rs +++ b/src/response/certificate/not_authorized.rs @@ -11,7 +11,7 @@ impl NotAuthorized { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/certificate/not_valid.rs b/src/response/certificate/not_valid.rs index 0ac3747..6880a83 100644 --- a/src/response/certificate/not_valid.rs +++ b/src/response/certificate/not_valid.rs @@ -11,7 +11,7 @@ impl NotValid { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/permanent/bad_request.rs b/src/response/failure/permanent/bad_request.rs index ba64bc6..6c8c9b8 100644 --- a/src/response/failure/permanent/bad_request.rs +++ b/src/response/failure/permanent/bad_request.rs @@ -11,7 +11,7 @@ impl BadRequest { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/permanent/general.rs b/src/response/failure/permanent/general.rs index 5b6faaa..7cb3eab 100644 --- a/src/response/failure/permanent/general.rs +++ b/src/response/failure/permanent/general.rs @@ -11,7 +11,7 @@ impl General { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/permanent/gone.rs b/src/response/failure/permanent/gone.rs index b961a12..647135e 100644 --- a/src/response/failure/permanent/gone.rs +++ b/src/response/failure/permanent/gone.rs @@ -11,7 +11,7 @@ impl Gone { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/permanent/not_found.rs b/src/response/failure/permanent/not_found.rs index 6b633d3..8b01ef4 100644 --- a/src/response/failure/permanent/not_found.rs +++ b/src/response/failure/permanent/not_found.rs @@ -11,7 +11,7 @@ impl NotFound { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/permanent/proxy_request_refused.rs b/src/response/failure/permanent/proxy_request_refused.rs index 0c80400..3904028 100644 --- a/src/response/failure/permanent/proxy_request_refused.rs +++ b/src/response/failure/permanent/proxy_request_refused.rs @@ -11,7 +11,7 @@ impl ProxyRequestRefused { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/temporary/cgi_error.rs b/src/response/failure/temporary/cgi_error.rs index 54f0e5d..2d8a4c3 100644 --- a/src/response/failure/temporary/cgi_error.rs +++ b/src/response/failure/temporary/cgi_error.rs @@ -11,7 +11,7 @@ impl CgiError { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/temporary/general.rs b/src/response/failure/temporary/general.rs index 8473a16..59d9eac 100644 --- a/src/response/failure/temporary/general.rs +++ b/src/response/failure/temporary/general.rs @@ -11,7 +11,7 @@ impl General { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/temporary/proxy_error.rs b/src/response/failure/temporary/proxy_error.rs index cb712da..5cd376d 100644 --- a/src/response/failure/temporary/proxy_error.rs +++ b/src/response/failure/temporary/proxy_error.rs @@ -11,7 +11,7 @@ impl ProxyError { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/temporary/server_unavailable.rs b/src/response/failure/temporary/server_unavailable.rs index b1e8c56..005b8d7 100644 --- a/src/response/failure/temporary/server_unavailable.rs +++ b/src/response/failure/temporary/server_unavailable.rs @@ -11,7 +11,7 @@ impl ServerUnavailable { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/failure/temporary/slow_down.rs b/src/response/failure/temporary/slow_down.rs index f3a328d..99824b8 100644 --- a/src/response/failure/temporary/slow_down.rs +++ b/src/response/failure/temporary/slow_down.rs @@ -11,7 +11,7 @@ impl SlowDown { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/input/default.rs b/src/response/input/default.rs index 9e5e5cf..84917c6 100644 --- a/src/response/input/default.rs +++ b/src/response/input/default.rs @@ -11,7 +11,7 @@ impl Default { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/input/sensitive.rs b/src/response/input/sensitive.rs index 6fd0607..6420c18 100644 --- a/src/response/input/sensitive.rs +++ b/src/response/input/sensitive.rs @@ -11,7 +11,7 @@ impl Sensitive { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/redirect/permanent.rs b/src/response/redirect/permanent.rs index 76c7e1a..46da5ca 100644 --- a/src/response/redirect/permanent.rs +++ b/src/response/redirect/permanent.rs @@ -11,7 +11,7 @@ impl Permanent { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/redirect/temporary.rs b/src/response/redirect/temporary.rs index d98bd4d..a591e3a 100644 --- a/src/response/redirect/temporary.rs +++ b/src/response/redirect/temporary.rs @@ -11,7 +11,7 @@ impl Temporary { /// Build `Self` from UTF-8 header bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; let h = buffer.header_bytes()?; if h.get(..2) .is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1]) diff --git a/src/response/success/default/meta.rs b/src/response/success/default/meta.rs index a4933c4..84409e3 100644 --- a/src/response/success/default/meta.rs +++ b/src/response/success/default/meta.rs @@ -8,7 +8,7 @@ impl Meta { /// Build `Self` from UTF-8 meta bytes /// * expected buffer includes leading status code, message, CRLF pub fn from_bytes(buffer: &[u8]) -> Result { - use crate::Header; + use crate::tool::Header; use regex::Regex; use std::str::from_utf8; let h = buffer.header_bytes()?; diff --git a/src/tool.rs b/src/tool.rs new file mode 100644 index 0000000..61c5e27 --- /dev/null +++ b/src/tool.rs @@ -0,0 +1,23 @@ +pub trait Header { + fn header_bytes(&self) -> Result<&[u8]>; +} + +impl Header for &[u8] { + fn header_bytes(&self) -> Result<&[u8]> { + match self.iter().position(|&b| b == b'\r') { + Some(n) => { + if n > crate::HEADER_MAX_LEN { + bail!("Header bytes length reached") + } + if self.get(n + 1).is_some_and(|&b| b == b'\n') { + Ok(&self[..n]) + } else { + bail!("LF byte not found") + } + } + None => bail!("CR byte not found"), + } + } +} + +use anyhow::{bail, Result};