Skip to content

Commit 44419af

Browse files
author
yggverse
committed
use global Header trait
1 parent 91077d3 commit 44419af

18 files changed

+163
-362
lines changed

src/request/titan.rs

+3-18
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,11 @@ pub struct Titan<'a> {
1313

1414
impl<'a> Titan<'a> {
1515
pub fn from_bytes(buffer: &'a [u8]) -> Result<Self> {
16+
use crate::Header;
1617
use regex::Regex;
17-
18-
let mut l: usize = 0;
19-
20-
for b in buffer {
21-
l += 1;
22-
if l > 1024 {
23-
bail!("Max header length reached!")
24-
}
25-
if *b == b'\r' {
26-
continue;
27-
}
28-
if *b == b'\n' {
29-
break;
30-
}
31-
}
32-
33-
let header = from_utf8(&buffer[..l])?;
18+
let header = from_utf8(buffer.header_bytes()?)?;
3419
Ok(Self {
35-
data: &buffer[l..],
20+
data: &buffer[header.len() + 2..],
3621
size: match Regex::new(r"size=(\d+)")?.captures(header) {
3722
Some(c) => match c.get(1) {
3823
Some(v) => match v.as_str().parse::<usize>() {

src/response/certificate/expected.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl Expected {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/certificate/not_authorized.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl NotAuthorized {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/certificate/not_valid.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl NotValid {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/failure/permanent/bad_request.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl BadRequest {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/failure/permanent/general.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl General {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/failure/permanent/gone.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl Gone {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/failure/permanent/not_found.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl NotFound {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

src/response/failure/permanent/proxy_request_refused.rs

+10-20
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ impl ProxyRequestRefused {
1111
/// Build `Self` from UTF-8 header bytes
1212
/// * expected buffer includes leading status code, message, CRLF
1313
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
14-
// calculate length once
15-
let len = buffer.len();
16-
// validate headers for this response type
17-
if !(3..=1024).contains(&len) {
18-
bail!("Unexpected header length")
19-
}
20-
if buffer
21-
.get(..2)
14+
use crate::Header;
15+
let h = buffer.header_bytes()?;
16+
if h.get(..2)
2217
.is_none_or(|c| c[0] != CODE[0] || c[1] != CODE[1])
2318
{
2419
bail!("Invalid status code")
2520
}
26-
// collect data bytes
27-
let mut m = Vec::with_capacity(len);
28-
for b in buffer[3..].iter() {
29-
if *b == b'\r' {
30-
continue;
31-
}
32-
if *b == b'\n' {
33-
break;
34-
}
35-
m.push(*b)
36-
}
3721
Ok(Self {
38-
message: String::from_utf8(m).map(|m| if m.is_empty() { None } else { Some(m) })?,
22+
message: String::from_utf8((&h[3..]).to_vec()).map(|m| {
23+
if m.is_empty() {
24+
None
25+
} else {
26+
Some(m)
27+
}
28+
})?,
3929
})
4030
}
4131

0 commit comments

Comments
 (0)