From c122ca8b4d8abe04adfef02d8d52c1746f0b5985 Mon Sep 17 00:00:00 2001 From: Jun Kurihara Date: Fri, 24 Jun 2022 23:35:47 -0400 Subject: [PATCH] todo: switching_protocols in response and transfer-encoding --- src/proxy/proxy_handler.rs | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/proxy/proxy_handler.rs b/src/proxy/proxy_handler.rs index 4097620..a422129 100644 --- a/src/proxy/proxy_handler.rs +++ b/src/proxy/proxy_handler.rs @@ -1,9 +1,10 @@ -// Motivated by https://github.com/felipenoris/hyper-reverse-proxy +// Highly motivated by https://github.com/felipenoris/hyper-reverse-proxy use super::Proxy; use crate::{error::*, log::*}; use hyper::{ client::connect::Connect, header::{HeaderMap, HeaderValue}, + http::response, Body, Request, Response, StatusCode, Uri, }; use std::net::SocketAddr; @@ -77,21 +78,34 @@ where }; debug!("Request to be forwarded: {:?}", req_forwarded); - // // Forward request to - // let res_backend = match self.forwarder.request(req_forwarded).await { - // Ok(res) => res, - // Err(e) => { - // error!("Failed to get response from backend: {}", e); - // return http_error(StatusCode::BAD_REQUEST); - // } - // }; - // debug!("Response from backend: {:?}", res_backend.status()); - // Ok(res_backend) + // Forward request to + let mut res_backend = match self.forwarder.request(req_forwarded).await { + Ok(res) => res, + Err(e) => { + error!("Failed to get response from backend: {}", e); + return http_error(StatusCode::BAD_REQUEST); + } + }; + debug!("Response from backend: {:?}", res_backend.status()); - http_error(StatusCode::NOT_FOUND) + // TODO: Handle StatusCode::SWITCHING_PROTOCOLS + + // Generate response to client + if generate_response_forwarded(&mut res_backend).is_ok() { + Ok(res_backend) + } else { + http_error(StatusCode::BAD_GATEWAY) + } } } +fn generate_response_forwarded(response: &mut Response) -> Result<()> { + let headers = response.headers_mut(); + remove_hop_header(headers); + remove_connection_header(headers); + Ok(()) +} + fn generate_request_forwarded( client_addr: SocketAddr, mut req: Request,