-
Notifications
You must be signed in to change notification settings - Fork 244
/
urlencoded.rs
101 lines (91 loc) · 2.87 KB
/
urlencoded.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
use crate::{pretty_comparison, ProtocolTestFailure};
use regex::Regex;
fn rewrite_url_encoded_map_keys(input: &str) -> (String, String) {
let mut itr = input.split('=');
let (key, value) = (itr.next().unwrap(), itr.next().unwrap());
let regex = Regex::new(r"^(.+)\.\d+\.(.+)$").unwrap();
if let Some(captures) = regex.captures(key) {
let rewritten_key = format!(
"{}.N.{}",
captures.get(1).unwrap().as_str(),
captures.get(2).unwrap().as_str()
);
(rewritten_key, value.to_string())
} else {
(key.to_string(), value.to_string())
}
}
fn rewrite_url_encoded_body(input: &str) -> String {
let mut entries: Vec<(String, String)> = input
.split('&')
.map(|entry| entry.trim())
.filter(|s| !s.is_empty())
.map(rewrite_url_encoded_map_keys)
.collect();
if entries.len() > 2 {
entries[2..].sort_by(|a, b| a.1.cmp(&b.1));
}
let entries: Vec<String> = entries
.into_iter()
.map(|kv| format!("{}={}", kv.0, kv.1))
.collect();
entries.join("\n&")
}
pub fn try_url_encoded_form_equivalent(
actual: &str,
expected: &str,
) -> Result<(), ProtocolTestFailure> {
let actual = rewrite_url_encoded_body(actual);
let expected = rewrite_url_encoded_body(expected);
if actual == expected {
Ok(())
} else {
Err(ProtocolTestFailure::BodyDidNotMatch {
comparison: pretty_comparison(&actual, &expected),
hint: "".into(),
})
}
}
#[cfg(test)]
mod tests {
use crate::urlencoded::try_url_encoded_form_equivalent;
#[test]
fn test_url_encoded_form_equivalent() {
assert_eq!(
Ok(()),
try_url_encoded_form_equivalent(
"Action=Something&Version=test",
"Action=Something&Version=test",
)
);
assert!(try_url_encoded_form_equivalent(
"Action=Something&Version=test&Property=foo",
"Action=Something&Version=test&Property=bar",
)
.is_err());
assert!(try_url_encoded_form_equivalent(
"Action=Something&Version=test&WrongProperty=foo",
"Action=Something&Version=test&Property=foo",
)
.is_err());
assert_eq!(
Ok(()),
try_url_encoded_form_equivalent(
"Action=Something&Version=test\
&SomeMap.1.key=foo\
&SomeMap.1.value=Foo\
&SomeMap.2.key=bar\
&SomeMap.2.value=Bar",
"Action=Something&Version=test\
&SomeMap.1.key=bar\
&SomeMap.1.value=Bar\
&SomeMap.2.key=foo\
&SomeMap.2.value=Foo",
)
);
}
}