72 lines
2.9 KiB
Rust
72 lines
2.9 KiB
Rust
// 使用实际三条调用路径记录接受/拒绝,不把 Axum 默认行为误当成 Dever 合同。
|
|
fn query_checks() {
|
|
let suffix = "&count=-7&enabled=true&ratio=1.25";
|
|
let mut cases = vec![
|
|
("plain", format!("name=Alice{suffix}")),
|
|
("empty_text", format!("name={suffix}")),
|
|
("unicode", format!("name=%E9%9B%AA+test{suffix}")),
|
|
("escaped_separator", format!("name=a%26b%3Dc{suffix}")),
|
|
("escaped_percent", format!("name=%25{suffix}")),
|
|
(
|
|
"valid_replacement_character",
|
|
format!("name=%EF%BF%BD{suffix}"),
|
|
),
|
|
("duplicate_required", format!("name=a&name=b{suffix}")),
|
|
("duplicate_optional", format!("name=a{suffix}&tag=x&tag=y")),
|
|
("escaped_duplicate", format!("name=a&%6Eame=b{suffix}")),
|
|
("unknown", format!("name=a{suffix}&extra=x")),
|
|
("missing_required", "name=a&enabled=true&ratio=1.25".into()),
|
|
("optional_present", format!("name=a{suffix}&tag=x")),
|
|
("empty_pairs", format!("&&name=a&&{suffix}&")),
|
|
("missing_equals", format!("name{suffix}")),
|
|
("truncated_percent", format!("name=%{suffix}")),
|
|
("short_percent", format!("name=%A{suffix}")),
|
|
("invalid_hex", format!("name=%GG{suffix}")),
|
|
("invalid_utf8", format!("name=%FF{suffix}")),
|
|
("overlong_utf8", format!("name=%C0%AF{suffix}")),
|
|
("encoded_surrogate", format!("name=%ED%A0%80{suffix}")),
|
|
("nul", format!("name=%00{suffix}")),
|
|
];
|
|
for (name, value) in [
|
|
("int_min", "-9223372036854775808"),
|
|
("int_max", "9223372036854775807"),
|
|
("int_overflow", "9223372036854775808"),
|
|
("int_fraction", "1.5"),
|
|
("int_leading_zero", "007"),
|
|
("int_encoded_plus", "%2B7"),
|
|
] {
|
|
cases.push((
|
|
name,
|
|
format!("name=a&count={value}&enabled=true&ratio=1.25"),
|
|
));
|
|
}
|
|
for (name, value) in [
|
|
("float_nan", "NaN"),
|
|
("float_inf", "inf"),
|
|
("float_overflow", "1e999"),
|
|
("float_negative_zero", "-0"),
|
|
("float_exponent", "1.5e3"),
|
|
] {
|
|
cases.push((name, format!("name=a&count=7&enabled=true&ratio={value}")));
|
|
}
|
|
cases.push(("invalid_bool", "name=a&count=7&enabled=1&ratio=1.25".into()));
|
|
println!("case,dever,axum,serde_urlencoded,equal_values");
|
|
for (name, query) in cases {
|
|
let input = [query_input(&query)];
|
|
let actual = runtime_query::<QueryArguments>(&input);
|
|
let axum = axum_query::<QueryArguments>(&input);
|
|
let serde = serde_query::<QueryArguments>(&input);
|
|
let equal = match (&actual, &axum, &serde) {
|
|
(Ok(actual), Ok(axum), Ok(serde)) => actual == axum && actual == serde,
|
|
(Err(_), Err(_), Err(_)) => true,
|
|
_ => false,
|
|
};
|
|
println!(
|
|
"{name},{},{},{},{equal}",
|
|
actual.is_ok(),
|
|
axum.is_ok(),
|
|
serde.is_ok()
|
|
);
|
|
}
|
|
}
|