1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-04-06 21:20:33 +02:00
Files
guix/gnu/packages/patches/mitm-cache-head-requests.patch
Maxim Cournoyer 33bb5f129d gnu: mitm-cache: Apply patch to gracefully handle HEAD requests.
* gnu/packages/patches/mitm-cache-head-requests.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register.
* gnu/packages/rust-apps.scm (mitm-cache): Apply it.

Change-Id: I3480735340ef72be2acf8a3fdcfa9e71a6961b45
2026-01-27 14:27:25 +09:00

70 lines
3.6 KiB
Diff

Upstream-status: <https://github.com/chayleaf/mitm-cache/pull/5>
diff --git a/src/main.rs b/src/main.rs
index d9f760f..215ed89 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,6 @@
use base64::Engine;
use clap::{Parser, Subcommand};
+use futures_util::StreamExt;
use http_body_util::BodyExt;
use hudsucker::{
certificate_authority::RcgenAuthority,
@@ -11,6 +12,7 @@ use hudsucker::{
tokio_tungstenite::tungstenite::http::uri::Scheme,
Body, HttpContext, HttpHandler, Proxy, RequestOrResponse,
};
+use hyper::Method;
use hyper::{StatusCode, Uri};
use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder};
use hyper_util::{
@@ -137,11 +139,15 @@ impl HttpHandler for Handler {
"GET" | "POST" | "HEAD" => {
let original_url = req.uri().clone();
println!("{req:?}");
- let Ok(req) = decode_request(req) else {
+ let Ok(mut req) = decode_request(req) else {
let mut res = Response::new("not found".into());
*res.status_mut() = StatusCode::NOT_FOUND;
return res.into();
};
+ let is_head_request = req.method() == "HEAD";
+ if is_head_request {
+ *req.method_mut() = Method::GET;
+ }
let (info, body) = req.into_parts();
let Ok(req_body) = body.collect().await.map(|x| x.to_bytes())
else {
@@ -165,7 +171,7 @@ impl HttpHandler for Handler {
req_body
)])),
);
- let store_body_info = req.method() != "HEAD";
+ let store_body_info = true;
let url = process_uri(original_url);
if matches!(forget_regex, Some(x) if x.is_match(&url.to_string())) {
forget = true;
@@ -307,7 +313,20 @@ impl HttpHandler for Handler {
}
}
});
- Response::from_parts(info, ret_body)
+ if is_head_request {
+ // For HEAD requests, drain the channel
+ // output; otherwise rx will be dropped,
+ // which closes the channel and causes
+ // the tx.poll_ready call above to
+ // return an error
+ let mut stream = ret_body.into_data_stream();
+ while let Some(_) = stream.next().await {
+ // do nothing
+ }
+ Response::from_parts(info, Body::empty())
+ } else {
+ Response::from_parts(info, ret_body)
+ }
} else {
// remove hash headers to force the software to download this
// so we get sha256