satex_service/proxy/
make.rs1use 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}