// 使用实际三条调用路径记录接受/拒绝,不把 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::(&input); let axum = axum_query::(&input); let serde = serde_query::(&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() ); } }