#[derive(Clone)] struct ValidatedRoutingIdentity { original_host: HeaderValue, host: String, decoded_path: Option, } #[derive(Clone)] struct SelectedRouteContext { frontend: Option>, route: Option>, validated: Option, } fn take_routing_identity( request: &mut Request, tls: bool, ) -> Result<(Option, HeaderValue, String, Option, bool), Response> { let mut selected_context = request.extensions_mut().remove::(); 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)) }