mirror of
https://github.com/YGGverse/titanite.git
synced 2026-04-02 18:15:27 +00:00
use separated mod for system tools
This commit is contained in:
parent
8622fb10b4
commit
1d60db70c9
22 changed files with 44 additions and 43 deletions
24
src/lib.rs
24
src/lib.rs
|
|
@ -6,26 +6,4 @@ pub use response::Response;
|
||||||
|
|
||||||
pub const HEADER_MAX_LEN: usize = 1024;
|
pub const HEADER_MAX_LEN: usize = 1024;
|
||||||
|
|
||||||
trait Header {
|
mod tool;
|
||||||
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};
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ pub struct Gemini {
|
||||||
|
|
||||||
impl Gemini {
|
impl Gemini {
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
url: Url::parse(std::str::from_utf8(buffer.header_bytes()?)?)?,
|
url: Url::parse(std::str::from_utf8(buffer.header_bytes()?)?)?,
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ pub struct Meta {
|
||||||
|
|
||||||
impl Meta {
|
impl Meta {
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
let header = from_utf8(buffer.header_bytes()?)?;
|
let header = from_utf8(buffer.header_bytes()?)?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Expected {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl NotAuthorized {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl NotValid {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl BadRequest {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl General {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Gone {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl NotFound {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl ProxyRequestRefused {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl CgiError {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl General {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl ProxyError {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl ServerUnavailable {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl SlowDown {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Default {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Sensitive {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Permanent {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ impl Temporary {
|
||||||
/// Build `Self` from UTF-8 header bytes
|
/// Build `Self` from UTF-8 header bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
if h.get(..2)
|
if h.get(..2)
|
||||||
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ impl Meta {
|
||||||
/// Build `Self` from UTF-8 meta bytes
|
/// Build `Self` from UTF-8 meta bytes
|
||||||
/// * expected buffer includes leading status code, message, CRLF
|
/// * expected buffer includes leading status code, message, CRLF
|
||||||
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
|
||||||
use crate::Header;
|
use crate::tool::Header;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
let h = buffer.header_bytes()?;
|
let h = buffer.header_bytes()?;
|
||||||
|
|
|
||||||
23
src/tool.rs
Normal file
23
src/tool.rs
Normal 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};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue