1pub mod body_transform;
12pub mod client;
13pub mod conditional;
14pub mod config;
15pub mod handler;
16pub mod middleware;
17pub mod routing;
18
19pub use body_transform::BodyTransformationMiddleware;
21pub use config::{BodyTransform, BodyTransformRule, MigrationMode, TransformOperation};
22pub use middleware::*;
23pub use routing::*;
24
25pub use client::{ProxyClient, ProxyResponse};
28pub use conditional::{evaluate_proxy_condition, find_matching_rule};
29pub use config::{ProxyConfig, ProxyRule};
33pub use handler::ProxyHandler;
34
35#[cfg(test)]
38mod tests {
39 use super::*;
40 use axum::http::Method;
41
42 #[test]
43 fn test_proxy_config() {
44 let mut config = ProxyConfig::new("http://api.example.com".to_string());
45 config.enabled = true;
46 assert!(config.should_proxy(&Method::GET, "/proxy/users"));
47 assert!(!config.should_proxy(&Method::GET, "/api/users"));
48
49 let stripped = config.strip_prefix("/proxy/users");
50 assert_eq!(stripped, "/users");
51 }
52
53 #[test]
54 fn test_proxy_config_no_prefix() {
55 let mut config = ProxyConfig::new("http://api.example.com".to_string());
56 config.prefix = None;
57 config.enabled = true;
58
59 assert!(config.should_proxy(&Method::GET, "/api/users"));
60 assert!(config.should_proxy(&Method::GET, "/any/path"));
61
62 let stripped = config.strip_prefix("/api/users");
63 assert_eq!(stripped, "/api/users");
64 }
65
66 #[test]
67 fn test_proxy_config_with_rules() {
68 let mut config = ProxyConfig::new("http://default.example.com".to_string());
69 config.enabled = true;
70 config.rules.push(ProxyRule {
71 path_pattern: "/api/users/*".to_string(),
72 target_url: "http://users.example.com".to_string(),
73 enabled: true,
74 pattern: "/api/users/*".to_string(),
75 upstream_url: "http://users.example.com".to_string(),
76 migration_mode: MigrationMode::Auto,
77 migration_group: None,
78 condition: None,
79 });
80 config.rules.push(ProxyRule {
81 path_pattern: "/api/orders/*".to_string(),
82 target_url: "http://orders.example.com".to_string(),
83 enabled: true,
84 pattern: "/api/orders/*".to_string(),
85 upstream_url: "http://orders.example.com".to_string(),
86 migration_mode: MigrationMode::Auto,
87 migration_group: None,
88 condition: None,
89 });
90
91 assert!(config.should_proxy(&Method::GET, "/api/users/123"));
92 assert!(config.should_proxy(&Method::GET, "/api/orders/456"));
93
94 assert_eq!(config.get_upstream_url("/api/users/123"), "http://users.example.com");
95 assert_eq!(config.get_upstream_url("/api/orders/456"), "http://orders.example.com");
96 assert_eq!(config.get_upstream_url("/api/products"), "http://default.example.com");
97 }
98
99 #[test]
100 fn test_proxy_config_passthrough() {
101 let mut config = ProxyConfig::new("http://api.example.com".to_string());
102 config.passthrough_by_default = true;
103 config.prefix = None;
104 config.enabled = true;
105
106 assert!(config.should_proxy(&Method::GET, "/api/users"));
108 assert!(config.should_proxy(&Method::POST, "/api/orders"));
109
110 config.passthrough_by_default = false;
112 config.prefix = Some("/proxy".to_string());
113
114 assert!(config.should_proxy(&Method::GET, "/proxy/users"));
116 assert!(!config.should_proxy(&Method::GET, "/api/users"));
117 }
118}