diff --git a/rpxy-lib/src/message_handler/handler_main.rs b/rpxy-lib/src/message_handler/handler_main.rs index 5fb978d..c46ac85 100644 --- a/rpxy-lib/src/message_handler/handler_main.rs +++ b/rpxy-lib/src/message_handler/handler_main.rs @@ -143,6 +143,12 @@ where // Upgrade in request header let upgrade_in_request = extract_upgrade(req.headers()); + if upgrade_in_request.is_some() && req.version() != http::Version::HTTP_11 { + return Err(HttpError::FailedToUpgrade(format!( + "Unsupported HTTP version: {:?}", + req.version() + ))); + } // let request_upgraded = req.extensions_mut().remove::(); let req_on_upgrade = hyper::upgrade::on(&mut req); diff --git a/rpxy-lib/src/message_handler/handler_manipulate_messages.rs b/rpxy-lib/src/message_handler/handler_manipulate_messages.rs index 529a17a..a0b37e0 100644 --- a/rpxy-lib/src/message_handler/handler_manipulate_messages.rs +++ b/rpxy-lib/src/message_handler/handler_manipulate_messages.rs @@ -177,8 +177,11 @@ where .headers_mut() .insert(header::CONNECTION, HeaderValue::from_static("upgrade")); } + if upgrade.is_none() { + // can update request line i.e., http version, only if not upgrade (http 1.1) + update_request_line(req, upstream_chosen, upstream_candidates)?; + } - update_request_line(req, upstream_chosen, upstream_candidates)?; Ok(context) } diff --git a/rpxy-lib/src/message_handler/http_result.rs b/rpxy-lib/src/message_handler/http_result.rs index 691c087..98cdb45 100644 --- a/rpxy-lib/src/message_handler/http_result.rs +++ b/rpxy-lib/src/message_handler/http_result.rs @@ -8,8 +8,8 @@ pub(crate) type HttpResult = std::result::Result; /// Describes things that can go wrong in the forwarder #[derive(Debug, Error)] pub enum HttpError { - #[error("No host is give nin request header")] - NoHostInRequestHeader, + // #[error("No host is give in request header")] + // NoHostInRequestHeader, #[error("Invalid host in request header")] InvalidHostInRequestHeader, #[error("SNI and Host header mismatch")] @@ -43,7 +43,7 @@ pub enum HttpError { impl From for StatusCode { fn from(e: HttpError) -> StatusCode { match e { - HttpError::NoHostInRequestHeader => StatusCode::BAD_REQUEST, + // HttpError::NoHostInRequestHeader => StatusCode::BAD_REQUEST, HttpError::InvalidHostInRequestHeader => StatusCode::BAD_REQUEST, HttpError::SniHostInconsistency => StatusCode::MISDIRECTED_REQUEST, HttpError::NoMatchingBackendApp => StatusCode::SERVICE_UNAVAILABLE,