satex_service/proxy/
make.rs

1use crate::make::MakeRouteService;
2use crate::proxy::client::{Client, ClientConfig};
3use crate::proxy::service::ProxyRouteService;
4use http::Extensions;
5use satex_core::Error;
6use satex_core::component::{Args, Configurable};
7use satex_core::digest::DefaultDigester;
8use satex_core::util::remove_end_sep;
9use satex_load_balancer::LoadBalancer;
10use satex_load_balancer::resolver::{ArcLoadBalancerResolver, LoadBalancerResolver};
11use satex_macro::make;
12use std::str::FromStr;
13use std::sync::Arc;
14use url::Url;
15
16#[make(kind = Proxy)]
17struct MakeProxyRouteService {
18    uri: String,
19    #[serde(default)]
20    client: ClientConfig,
21}
22
23impl MakeRouteService for MakeProxyRouteService {
24    type Service = ProxyRouteService<DefaultDigester>;
25
26    fn make(&self, args: Args, extensions: &Extensions) -> Result<Self::Service, Error> {
27        Config::with_args(args).and_then(|config| {
28            Url::from_str(remove_end_sep(&config.uri))
29                .map_err(Error::new)
30                .map(|url| {
31                    let load_balancer = extensions
32                        .get::<ArcLoadBalancerResolver>()
33                        .and_then(|registry| get_load_balancer(registry, &url));
34
35                    ProxyRouteService::new(
36                        url,
37                        Client::from(config.client),
38                        DefaultDigester,
39                        load_balancer,
40                    )
41                })
42        })
43    }
44}
45
46fn get_load_balancer(resolver: &ArcLoadBalancerResolver, url: &Url) -> Option<Arc<LoadBalancer>> {
47    if let Some(load_balancer) = resolver.find(url.host_str().unwrap_or_default()) {
48        return Some(load_balancer);
49    }
50    None
51}