11use std:: ops:: Range ;
22
3- use crate :: { models:: partial_request:: PartialHttpRequest , span:: get_line_spans} ;
3+ use crate :: { error :: Error , models:: partial_request:: PartialHttpRequest , span:: get_line_spans} ;
44
5- pub ( crate ) fn parse_request ( input : & str ) -> PartialHttpRequest {
5+ pub ( crate ) fn parse_request ( input : & str ) -> Result < PartialHttpRequest , Error > {
66 let line_spans = get_line_spans ( input) ;
77
8- let first_empty_line = line_spans. iter ( ) . position ( |span| span. len ( ) == 1 ) ;
8+ let first_empty_line_idx = line_spans. iter ( ) . position ( |span| span. len ( ) == 1 ) ;
99
10- let ( method, uri, http_version) = line_spans
11- . first ( )
12- . map ( |span| parse_first_line ( & input[ span. clone ( ) ] ) )
10+ let first_line = line_spans. first ( ) ;
11+
12+ let ( method, uri, http_version) = first_line
13+ . map ( |span| & input[ span. clone ( ) ] )
14+ . map ( parse_first_line)
1315 . unwrap_or ( ( None , None , None ) ) ;
1416
15- let ( header_spans, body_spans) = match first_empty_line {
16- Some ( first_empty_line_idx) => {
17- let header_spans = line_spans. clone ( ) [ 1 ..first_empty_line_idx] . to_vec ( ) ;
17+ let ( header_spans, body_spans) = match first_empty_line_idx {
18+ Some ( idx) => {
19+ let header_spans = line_spans. clone ( ) [ 1 ..idx] . to_vec ( ) ;
20+ let body_spans = Some ( line_spans. clone ( ) [ idx..] . to_vec ( ) ) ;
1821
19- (
20- header_spans,
21- Some ( line_spans. clone ( ) [ first_empty_line_idx..] . to_vec ( ) ) ,
22- )
22+ ( header_spans, body_spans)
2323 }
2424 None => {
2525 let header_spans = line_spans. clone ( ) [ 1 ..] . to_vec ( ) ;
26+ let body_spans = None ;
2627
27- ( header_spans, None )
28+ ( header_spans, body_spans )
2829 }
2930 } ;
3031
@@ -39,7 +40,14 @@ pub(crate) fn parse_request(input: &str) -> PartialHttpRequest {
3940 Some ( first. start + 1 ..last. end )
4041 } ) ;
4142
42- PartialHttpRequest :: new ( input, uri, method, http_version, header_spans, body_span)
43+ Ok ( PartialHttpRequest :: new (
44+ input,
45+ uri,
46+ method,
47+ http_version,
48+ header_spans,
49+ body_span,
50+ ) )
4351}
4452
4553/// Parse the first line of an HTTP request message
0 commit comments