use separated mod for system tools

This commit is contained in:
yggverse 2025-02-24 02:54:18 +02:00
parent 8622fb10b4
commit 1d60db70c9
22 changed files with 44 additions and 43 deletions

View file

@ -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;

View file

@ -8,7 +8,7 @@ pub struct Gemini {
impl Gemini {
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
use crate::Header;
use crate::tool::Header;
Ok(Self {
url: Url::parse(std::str::from_utf8(buffer.header_bytes()?)?)?,
})

View file

@ -8,7 +8,7 @@ pub struct Meta {
impl Meta {
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
use crate::Header;
use crate::tool::Header;
use regex::Regex;
let header = from_utf8(buffer.header_bytes()?)?;
Ok(Self {

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
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])

View file

@ -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<Self> {
use crate::Header;
use crate::tool::Header;
use regex::Regex;
use std::str::from_utf8;
let h = buffer.header_bytes()?;

23
src/tool.rs Normal file
View file

@ -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};