use std::{net::SocketAddr, sync::Arc};
use wenmeng::{RecvRequest};
use super::{UpstreamConfig, ServerConfig, LocationConfig};
pub struct ReverseHelper;
impl ReverseHelper {
pub fn get_upstream_addr(upstream: &Vec<UpstreamConfig>, name: &str) -> Option<SocketAddr> {
for stream in upstream {
if &stream.name == name {
return stream.get_server_addr()
} else if name == "" {
return stream.get_server_addr()
}
}
return None;
}
pub fn get_location_by_req<'a>(servers: &'a Vec<Arc<ServerConfig>>, req: &RecvRequest) -> Option<&'a LocationConfig> {
let server_len = servers.len();
let host = req.get_host().unwrap_or(String::new());
for (index, s) in servers.iter().enumerate() {
if s.up_name == host || host.is_empty() || index == server_len - 1 {
let path = req.path().clone();
for idx in 0..s.location.len() {
if s.location[idx].is_match_rule(&path, req) {
return Some(&s.location[idx]);
}
}
}
}
return None;
}
}