use super::{forward, upgrade, upload};
use crate::api::AppState;
use crate::error::Result;
use crate::handlers::{ensure_role_ready, resolve_role_from_uri};
use axum::body::Body;
use axum::extract::{OriginalUri, State};
use axum::http::{Response, header};
pub async fn proxy_fallback(
State(state): State<AppState>,
OriginalUri(uri): OriginalUri,
req: axum::http::Request<Body>,
) -> Result<Response<Body>> {
let role = resolve_role_from_uri(&state, &uri).await?;
tracing::debug!(
method = %req.method(),
uri = %uri,
utility_vm = role.as_str(),
"proxy_fallback dispatch",
);
ensure_role_ready(&state, role).await?;
let wants_upgrade = req.headers().get(header::UPGRADE).is_some()
|| req
.headers()
.get(header::CONNECTION)
.and_then(|v| v.to_str().ok())
.is_some_and(|v| v.to_ascii_lowercase().contains("upgrade"));
if wants_upgrade {
return upgrade::proxy_with_upgrade_for_role(state.connector.as_ref(), role, req, &uri)
.await;
}
if upload::is_streaming_upload_request(req.method(), &uri) {
return upload::proxy_streaming_upload_for_role(state.connector.as_ref(), role, &uri, req)
.await;
}
forward::proxy_to_guest_stream_for_role(state.connector.as_ref(), role, &uri, req).await
}