File tree 2 files changed +43
-19
lines changed
2 files changed +43
-19
lines changed Original file line number Diff line number Diff line change @@ -42,26 +42,26 @@ pub(super) fn content_length_parse_all_values(values: ValueIter<'_, HeaderValue>
42
42
// be alright if they all contain the same value, and all parse
43
43
// correctly. If not, then it's an error.
44
44
45
- let folded = values. fold ( None , |prev, line| match prev {
46
- Some ( Ok ( prev) ) => Some (
47
- line. to_str ( )
48
- . map_err ( |_| ( ) )
49
- . and_then ( |s| s. parse ( ) . map_err ( |_| ( ) ) )
50
- . and_then ( |n| if prev == n { Ok ( n) } else { Err ( ( ) ) } ) ,
51
- ) ,
52
- None => Some (
53
- line. to_str ( )
54
- . map_err ( |_| ( ) )
55
- . and_then ( |s| s. parse ( ) . map_err ( |_| ( ) ) ) ,
56
- ) ,
57
- Some ( Err ( ( ) ) ) => Some ( Err ( ( ) ) ) ,
58
- } ) ;
59
-
60
- if let Some ( Ok ( n) ) = folded {
61
- Some ( n)
62
- } else {
63
- None
45
+ let mut content_length: Option < u64 > = None ;
46
+ for h in values {
47
+ if let Ok ( line) = h. to_str ( ) {
48
+ for v in line. split ( ',' ) {
49
+ if let Some ( n) = v. trim ( ) . parse ( ) . ok ( ) {
50
+ if content_length. is_none ( ) {
51
+ content_length = Some ( n)
52
+ } else if content_length != Some ( n) {
53
+ return None ;
54
+ }
55
+ } else {
56
+ return None
57
+ }
58
+ }
59
+ } else {
60
+ return None
61
+ }
64
62
}
63
+
64
+ return content_length
65
65
}
66
66
67
67
#[ cfg( all( feature = "http2" , feature = "client" ) ) ]
Original file line number Diff line number Diff line change @@ -1043,6 +1043,30 @@ test! {
1043
1043
error: |err| err. to_string( ) == "request has unsupported HTTP version" ,
1044
1044
}
1045
1045
1046
+ test ! {
1047
+ name: client_handles_contentlength_values_on_same_line,
1048
+
1049
+ server:
1050
+ expected: "GET /foo HTTP/1.1\r \n host: {addr}\r \n \r \n " ,
1051
+ reply: "\
1052
+ HTTP/1.1 200 OK\r \n \
1053
+ Content-Length: 3,3\r \n \
1054
+ Content-Length: 3,3\r \n \
1055
+ \r \n \
1056
+ abc\r \n ",
1057
+
1058
+ client:
1059
+ request: {
1060
+ method: GET ,
1061
+ url: "http://{addr}/foo" ,
1062
+ } ,
1063
+ response:
1064
+ status: OK ,
1065
+ headers: {
1066
+ } ,
1067
+ body: & b"abc" [ ..] ,
1068
+ }
1069
+
1046
1070
mod dispatch_impl {
1047
1071
use super :: * ;
1048
1072
use std:: io:: { self , Read , Write } ;
You can’t perform that action at this time.
0 commit comments