limit upgrade only for http1.1 request

This commit is contained in:
Jun Kurihara 2023-12-15 16:29:51 +09:00
commit 1c1b50d213
No known key found for this signature in database
GPG key ID: 48ADFD173ED22B03
3 changed files with 13 additions and 4 deletions

View file

@ -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::<hyper::upgrade::OnUpgrade>();
let req_on_upgrade = hyper::upgrade::on(&mut req);

View file

@ -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)?;
}
Ok(context)
}

View file

@ -8,8 +8,8 @@ pub(crate) type HttpResult<T> = std::result::Result<T, HttpError>;
/// 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<HttpError> 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,