Estou criando um proxy usando axum para aceitar requisições do navegador e reqwest para enviar requisições para o host de destino em Rust. Então, tenho que mudar a requisição axum para reqwest e remover alguns cabeçalhos como host, origin, etc. Esta é minha função remove.
pub fn remove_headers(request: &reqwest::Request, keys_to_remove: Vec<String>) -> HeaderMap {
let mut cloned_headers = request.headers().clone();
// Convert keys_to_remove into a set for fast lookups
let keys_set: HashSet<String> = keys_to_remove.into_iter().collect();
// Create a new HeaderMap and only insert headers that are not in the keys_to_remove list
let filtered_headers = cloned_headers
.into_iter()
.filter(|(key, _)| {
// Dereference the key from &Option<HeaderName> to HeaderName and compare with the set
if let Some(header_name) = key {
!keys_set.contains(&header_name.as_str().to_string())
} else {
key.is_some()
}
})
.collect::<HeaderMap>(); // Collect back into a HeaderMap
filtered_headers
}
Espero que o tipo de chave seja &HeaderName, mas agora &Option. Então filtered_headers não é convertido para HeaderMap.
Além da dica postada nos comentários (usando
filter_map
), você pode economizar desempenho não copiando todas as coleções/strings envolvidas:String
, você pode fazer a pesquisa usando&str
Observe que se você puder mutar
request
, você pode simplesmente usarHeaderMap::remove
: