40 lines
1.5 KiB
Rust
40 lines
1.5 KiB
Rust
#[derive(Clone)]
|
|
struct ValidatedRoutingIdentity {
|
|
original_host: HeaderValue,
|
|
host: String,
|
|
decoded_path: Option<String>,
|
|
}
|
|
#[derive(Clone)]
|
|
struct SelectedRouteContext {
|
|
frontend: Option<Arc<crate::config::CompiledFrontend>>,
|
|
route: Option<Arc<crate::config::CompiledRoute>>,
|
|
validated: Option<ValidatedRoutingIdentity>,
|
|
}
|
|
fn take_routing_identity(
|
|
request: &mut Request,
|
|
tls: bool,
|
|
) -> Result<(Option<SelectedRouteContext>, HeaderValue, String, Option<String>, bool), Response> {
|
|
let mut selected_context = request.extensions_mut().remove::<SelectedRouteContext>();
|
|
let validated = selected_context.as_mut().and_then(|context| context.validated.take());
|
|
let host_already_validated = validated.is_some();
|
|
let (original_host, host, decoded_path) = match validated {
|
|
Some(validated) => (
|
|
validated.original_host,
|
|
validated.host,
|
|
validated.decoded_path,
|
|
),
|
|
None => {
|
|
let original_host = effective_host(request, tls).map_err(|_| error(
|
|
StatusCode::BAD_REQUEST,
|
|
"RustProxy: invalid or conflicting request authority\n",
|
|
))?;
|
|
let host = original_host.to_str().ok()
|
|
.and_then(|v| request_host(v).ok())
|
|
.ok_or_else(|| error(StatusCode::BAD_REQUEST,
|
|
"RustProxy: invalid hostname\n"))?;
|
|
(original_host, host, None)
|
|
}
|
|
};
|
|
Ok((selected_context, original_host, host, decoded_path, host_already_validated))
|
|
}
|