File tree 18 files changed +163
-362
lines changed
18 files changed +163
-362
lines changed Original file line number Diff line number Diff line change @@ -13,26 +13,11 @@ pub struct Titan<'a> {
13
13
14
14
impl < ' a > Titan < ' a > {
15
15
pub fn from_bytes ( buffer : & ' a [ u8 ] ) -> Result < Self > {
16
+ use crate :: Header ;
16
17
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 ( ) ?) ?;
34
19
Ok ( Self {
35
- data : & buffer[ l ..] ,
20
+ data : & buffer[ header . len ( ) + 2 ..] ,
36
21
size : match Regex :: new ( r"size=(\d+)" ) ?. captures ( header) {
37
22
Some ( c) => match c. get ( 1 ) {
38
23
Some ( v) => match v. as_str ( ) . parse :: < usize > ( ) {
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl Expected {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl NotAuthorized {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl NotValid {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl BadRequest {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl General {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl Gone {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl NotFound {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
Original file line number Diff line number Diff line change @@ -11,31 +11,21 @@ impl ProxyRequestRefused {
11
11
/// Build `Self` from UTF-8 header bytes
12
12
/// * expected buffer includes leading status code, message, CRLF
13
13
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 )
22
17
. is_none_or ( |c| c[ 0 ] != CODE [ 0 ] || c[ 1 ] != CODE [ 1 ] )
23
18
{
24
19
bail ! ( "Invalid status code" )
25
20
}
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
- }
37
21
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
+ } ) ?,
39
29
} )
40
30
}
41
31
You can’t perform that action at this time.
0 commit comments