diff --git a/src/main.rs b/src/main.rs index f9d26f5..4222e29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,9 +7,8 @@ pub mod speak_proxy; use anyhow::Result as AnyhowResult; use crate::newrelic_logger::{NewRelicLogger, MaybeNewRelicTransaction}; -use crate::speak_proxy::handle; use futures::future::{self, Future}; -use hyper::Method; +use hyper::{Method, StatusCode}; use hyper::header::HeaderValue; use hyper::http::header::HeaderName; use hyper::server::conn::AddrStream; @@ -21,7 +20,7 @@ use std::convert::Infallible; use std::env; use std::fmt::Debug; use std::fmt::Display; -use std::net::SocketAddr; +use std::net::{SocketAddr, IpAddr}; use std::str::FromStr; use std::sync::Arc; @@ -121,6 +120,66 @@ impl Router { } } +fn debug_request(req: Request) -> Result, Infallible> { + let body_str = format!("{:?}", req); + Ok(Response::new(Body::from(body_str))) +} + +pub async fn handle( + client_ip: IpAddr, + req: Request, + router: Arc, + newrelic_logger: Arc) -> Result, Infallible> +{ + match req.uri().path() { + "/speak" => { + debug_request(req) + }, + "/speak_spectrogram" => { + debug_request(req) + }, + "/proxy_health" => { + debug_request(req) + }, + _ => { + let _droppable_transaction = newrelic_logger.web_transaction("unmatched endpoint"); + let forward = router.get_random_host(); + + info!("Forwarding to `{}` random host: {}", &forward, req.uri()); + + match hyper_reverse_proxy::call(client_ip, &forward, req).await { + Ok(response) => {Ok(response)} + Err(error) => {Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .unwrap())} + } + }, + } + + /*if req.uri().path().starts_with("/target/first") { + // will forward requests to port 13901 + match hyper_reverse_proxy::call(client_ip, "http://127.0.0.1:13901", req).await { + Ok(response) => {Ok(response)} + Err(error) => {Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .unwrap())} + } + } else if req.uri().path().starts_with("/target/second") { + // will forward requests to port 13902 + match hyper_reverse_proxy::call(client_ip, "http://127.0.0.1:13902", req).await { + Ok(response) => {Ok(response)} + Err(error) => {Ok(Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(Body::empty()) + .unwrap())} + } + } else { + debug_request(req) + }*/ +} + #[tokio::main] async fn main() { if env::var(ENV_RUST_LOG) @@ -203,10 +262,20 @@ async fn main() { }) });*/ - let make_service = make_service_fn(|conn: &AddrStream| { + let make_service = make_service_fn(move |conn: &AddrStream| { let remote_addr = conn.remote_addr().ip(); + let router2 = router.clone(); + let newrelic_logger2 = newrelic_logger.clone(); + async move { - Ok::<_, Infallible>(service_fn(move |req| handle(remote_addr, req))) + let router3 = router2.clone(); + let newrelic_logger3 = newrelic_logger2.clone(); + + Ok::<_, Infallible>(service_fn(move |req| { + let router4 = router3.clone(); + let newrelic_logger4 = newrelic_logger3.clone(); + handle(remote_addr, req, router4, newrelic_logger4) + })) } }); diff --git a/src/speak_proxy.rs b/src/speak_proxy.rs index 584cec3..ccd4217 100644 --- a/src/speak_proxy.rs +++ b/src/speak_proxy.rs @@ -122,31 +122,3 @@ struct RequestDetails { }*/ -fn debug_request(req: Request) -> Result, Infallible> { - let body_str = format!("{:?}", req); - Ok(Response::new(Body::from(body_str))) -} - -pub async fn handle(client_ip: IpAddr, req: Request) -> Result, Infallible> { - if req.uri().path().starts_with("/target/first") { - // will forward requests to port 13901 - match hyper_reverse_proxy::call(client_ip, "http://127.0.0.1:13901", req).await { - Ok(response) => {Ok(response)} - Err(error) => {Ok(Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::empty()) - .unwrap())} - } - } else if req.uri().path().starts_with("/target/second") { - // will forward requests to port 13902 - match hyper_reverse_proxy::call(client_ip, "http://127.0.0.1:13902", req).await { - Ok(response) => {Ok(response)} - Err(error) => {Ok(Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(Body::empty()) - .unwrap())} - } - } else { - debug_request(req) - } -}