|
1 | 1 | use fastmulp_core::{Boundary, Error, parse}; |
2 | 2 |
|
| 3 | +fn assert_invalid_content_disposition(disposition: &str) { |
| 4 | + let body = format!( |
| 5 | + "--abc123\r\nContent-Disposition: {disposition}\r\n\r\npayload\r\n--abc123--\r\n" |
| 6 | + ); |
| 7 | + |
| 8 | + assert!(matches!( |
| 9 | + parse(body.as_bytes(), b"abc123"), |
| 10 | + Err(Error::InvalidContentDisposition { .. }) |
| 11 | + )); |
| 12 | +} |
| 13 | + |
3 | 14 | #[test] |
4 | 15 | fn rejects_missing_content_disposition() { |
5 | 16 | let body = concat!( |
@@ -32,6 +43,33 @@ fn rejects_missing_name_parameter() { |
32 | 43 | )); |
33 | 44 | } |
34 | 45 |
|
| 46 | +#[test] |
| 47 | +fn rejects_unquoted_content_disposition_parameter_values_with_whitespace() { |
| 48 | + for disposition in [ |
| 49 | + "form-data; name=field value", |
| 50 | + "form-data; name=field\tvalue", |
| 51 | + "form-data; name=field value; filename=blob.txt", |
| 52 | + ] { |
| 53 | + assert_invalid_content_disposition(disposition); |
| 54 | + } |
| 55 | +} |
| 56 | + |
| 57 | +#[test] |
| 58 | +fn rejects_unquoted_content_disposition_parameter_values_with_separators() { |
| 59 | + for disposition in [ |
| 60 | + "form-data; name=field\"value", |
| 61 | + "form-data; name=field,value", |
| 62 | + "form-data; name=field:value", |
| 63 | + "form-data; name=field/value", |
| 64 | + "form-data; name=field(value)", |
| 65 | + "form-data; name=field[value]", |
| 66 | + "form-data; name=field{value}", |
| 67 | + "form-data; name=field;value", |
| 68 | + ] { |
| 69 | + assert_invalid_content_disposition(disposition); |
| 70 | + } |
| 71 | +} |
| 72 | + |
35 | 73 | #[test] |
36 | 74 | fn rejects_header_continuation() { |
37 | 75 | let body = concat!( |
@@ -143,4 +181,3 @@ fn rejects_non_form_data_disposition() { |
143 | 181 | Err(Error::InvalidContentDisposition { .. }) |
144 | 182 | )); |
145 | 183 | } |
146 | | - |
|
0 commit comments