fix handling upgrade

This commit is contained in:
Jun Kurihara 2022-07-16 13:10:09 +09:00
commit c3c6d4f4fd
No known key found for this signature in database
GPG key ID: 48ADFD173ED22B03
2 changed files with 51 additions and 53 deletions

View file

@ -150,7 +150,18 @@ where
res_backend.log_debug(&backend.server_name, &client_addr, Some("(from Backend)")); res_backend.log_debug(&backend.server_name, &client_addr, Some("(from Backend)"));
// let response_log = res_backend.status().to_string(); // let response_log = res_backend.status().to_string();
if res_backend.status() == StatusCode::SWITCHING_PROTOCOLS { if res_backend.status() != StatusCode::SWITCHING_PROTOCOLS {
// Generate response to client
if self.generate_response_forwarded(&mut res_backend).is_ok() {
// info!("{} => {}", request_log, response_log);
res_backend.log_debug(&backend.server_name, &client_addr, Some("(to Client)"));
log_data.status_code(&res_backend.status()).output();
return Ok(res_backend);
} else {
return self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data);
}
}
// Handle StatusCode::SWITCHING_PROTOCOLS in response // Handle StatusCode::SWITCHING_PROTOCOLS in response
let upgrade_in_response = extract_upgrade(res_backend.headers()); let upgrade_in_response = extract_upgrade(res_backend.headers());
if if let (Some(u_req), Some(u_res)) = if if let (Some(u_req), Some(u_res)) =
@ -170,14 +181,12 @@ where
error!("Response does not have an upgrade extension"); error!("Response does not have an upgrade extension");
return self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data); return self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data);
}; };
let mut response_upgraded = if let Ok(res) = onupgrade.await {
res
} else {
error!("No upgrade is available");
return self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data);
};
self.globals.runtime_handle.spawn(async move { self.globals.runtime_handle.spawn(async move {
let mut response_upgraded = onupgrade.await.map_err(|e| {
error!("Failed to upgrade response: {}", e);
anyhow!("Failed to upgrade response: {}", e)
})?;
let mut request_upgraded = request_upgraded.await.map_err(|e| { let mut request_upgraded = request_upgraded.await.map_err(|e| {
error!("Failed to upgrade request: {}", e); error!("Failed to upgrade request: {}", e);
anyhow!("Failed to upgrade request: {}", e) anyhow!("Failed to upgrade request: {}", e)
@ -187,7 +196,7 @@ where
.map_err(|e| anyhow!("Coping between upgraded connections failed: {}", e))?; .map_err(|e| anyhow!("Coping between upgraded connections failed: {}", e))?;
Ok(()) as Result<()> Ok(()) as Result<()>
}); });
// info!("{} => {}", request_log, response_log); log_data.status_code(&res_backend.status()).output();
Ok(res_backend) Ok(res_backend)
} else { } else {
error!("Request does not have an upgrade extension"); error!("Request does not have an upgrade extension");
@ -200,17 +209,6 @@ where
); );
self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data) self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data)
} }
} else {
// Generate response to client
if self.generate_response_forwarded(&mut res_backend).is_ok() {
// info!("{} => {}", request_log, response_log);
res_backend.log_debug(&backend.server_name, &client_addr, Some("(to Client)"));
log_data.status_code(&res_backend.status()).output();
Ok(res_backend)
} else {
self.return_with_error_log(StatusCode::INTERNAL_SERVER_ERROR, &mut log_data)
}
}
} }
//////////////////////////////////////////////////// ////////////////////////////////////////////////////

View file

@ -101,7 +101,7 @@ where
} }
#[cfg(feature = "h3")] #[cfg(feature = "h3")]
async fn parse_sni_and_get_crypto_h3<'a, 'b>( async fn parse_sni_and_get_crypto_h3<'a>(
&self, &self,
peeked_conn: &mut quinn::Connecting, peeked_conn: &mut quinn::Connecting,
server_crypto_map: &'a ServerCryptoMap, server_crypto_map: &'a ServerCryptoMap,