mirror of
https://github.com/YGGverse/titanite.git
synced 2026-03-31 17:15:33 +00:00
use global Header trait
This commit is contained in:
parent
91077d3420
commit
44419afc16
18 changed files with 163 additions and 362 deletions
|
|
@ -13,26 +13,11 @@ pub struct Titan<'a> {
|
||||||
|
|
||||||
impl<'a> Titan<'a> {
|
impl<'a> Titan<'a> {
|
||||||
pub fn from_bytes(buffer: &'a [u8]) -> Result<Self> {
|
pub fn from_bytes(buffer: &'a [u8]) -> Result<Self> {
|
||||||
|
use crate::Header;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
let header = from_utf8(buffer.header_bytes()?)?;
|
||||||
let mut l: usize = 0;
|
|
||||||
|
|
||||||
for b in buffer {
|
|
||||||
l += 1;
|
|
||||||
if l > 1024 {
|
|
||||||
bail!("Max header length reached!")
|
|
||||||
}
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let header = from_utf8(&buffer[..l])?;
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
data: &buffer[l..],
|
data: &buffer[header.len() + 2..],
|
||||||
size: match Regex::new(r"size=(\d+)")?.captures(header) {
|
size: match Regex::new(r"size=(\d+)")?.captures(header) {
|
||||||
Some(c) => match c.get(1) {
|
Some(c) => match c.get(1) {
|
||||||
Some(v) => match v.as_str().parse::<usize>() {
|
Some(v) => match v.as_str().parse::<usize>() {
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,31 +11,21 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut m = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m.push(*b)
|
|
||||||
}
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
|
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
|
||||||
|
if m.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(m)
|
||||||
|
}
|
||||||
|
})?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,35 +11,18 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut t = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
t.push(*b)
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
target: if t.is_empty() {
|
target: if h.is_empty() {
|
||||||
bail!("Target required")
|
bail!("Target required")
|
||||||
} else {
|
} else {
|
||||||
String::from_utf8(t)?
|
String::from_utf8((&h[3..]).to_vec())?
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,35 +11,18 @@ 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> {
|
||||||
// calculate length once
|
use crate::Header;
|
||||||
let len = buffer.len();
|
let h = buffer.header_bytes()?;
|
||||||
// validate headers for this response type
|
if h.get(..2)
|
||||||
if !(3..=1024).contains(&len) {
|
|
||||||
bail!("Unexpected header length")
|
|
||||||
}
|
|
||||||
if buffer
|
|
||||||
.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])
|
||||||
{
|
{
|
||||||
bail!("Invalid status code")
|
bail!("Invalid status code")
|
||||||
}
|
}
|
||||||
// collect data bytes
|
|
||||||
let mut t = Vec::with_capacity(len);
|
|
||||||
for b in buffer[3..].iter() {
|
|
||||||
if *b == b'\r' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if *b == b'\n' {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
t.push(*b)
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
target: if t.is_empty() {
|
target: if h.is_empty() {
|
||||||
bail!("Target required")
|
bail!("Target required")
|
||||||
} else {
|
} else {
|
||||||
String::from_utf8(t)?
|
String::from_utf8((&h[3..]).to_vec())?
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue