about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2024-09-29T19·07+0200
committerclbot <clbot@tvl.fyi>2024-09-30T10·05+0000
commit752f1f82a6f6e81be1eaf0d4cf1518b1ddbc711e (patch)
tree3e5a8e47fb41b78588cd274c295ad15c4dd6cfe5
parent2e4a373a040b5e8355d05b8030341494d1ff386b (diff)
feat(tvix/nar-bridge): treat HEAD requests explicitly r/8738
We don't need to access castore for HEAD requests.

Change-Id: I9365d9520d5a9e52ed92897d3c4972ec5b6e11fb
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12547
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: raitobezarius <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
-rw-r--r--tvix/nar-bridge/src/lib.rs3
-rw-r--r--tvix/nar-bridge/src/nar.rs14
2 files changed, 13 insertions, 4 deletions
diff --git a/tvix/nar-bridge/src/lib.rs b/tvix/nar-bridge/src/lib.rs
index 79f9b7372245..c4a6c8d5f2dc 100644
--- a/tvix/nar-bridge/src/lib.rs
+++ b/tvix/nar-bridge/src/lib.rs
@@ -58,7 +58,8 @@ pub fn gen_router(priority: u64) -> Router<AppState> {
         .route("/nar/:nar_str", get(four_o_four))
         .route("/nar/:nar_str", head(four_o_four))
         .route("/nar/:nar_str", put(nar::put))
-        .route("/nar/tvix-castore/:root_node_enc", get(nar::get))
+        .route("/nar/tvix-castore/:root_node_enc", get(nar::get_head))
+        .route("/nar/tvix-castore/:root_node_enc", head(nar::get_head))
         .route("/:narinfo_str", get(narinfo::get))
         .route("/:narinfo_str", head(narinfo::head))
         .route("/:narinfo_str", put(narinfo::put))
diff --git a/tvix/nar-bridge/src/nar.rs b/tvix/nar-bridge/src/nar.rs
index 707c01e4bcda..d88719b02be9 100644
--- a/tvix/nar-bridge/src/nar.rs
+++ b/tvix/nar-bridge/src/nar.rs
@@ -23,7 +23,8 @@ pub(crate) struct GetNARParams {
 }
 
 #[instrument(skip(blob_service, directory_service))]
-pub async fn get(
+pub async fn get_head(
+    method: axum::http::Method,
     ranges: Option<TypedHeader<Range>>,
     axum::extract::Path(root_node_enc): axum::extract::Path<String>,
     axum::extract::Query(GetNARParams { nar_size }): Query<GetNARParams>,
@@ -71,8 +72,15 @@ pub async fn get(
             ("cache-control", "max-age=31536000, immutable"),
             ("content-type", nix_http::MIME_TYPE_NAR),
         ],
-        // If this is a range request, construct a seekable NAR reader
-        if let Some(TypedHeader(ranges)) = ranges {
+        if method == axum::http::Method::HEAD {
+            // If this is a HEAD request, construct a response returning back the
+            // user-provided content-length, but don't actually talk to castore.
+            Response::builder()
+                .header("content-length", nar_size)
+                .body(Body::empty())
+                .unwrap()
+        } else if let Some(TypedHeader(ranges)) = ranges {
+            // If this is a range request, construct a seekable NAR reader.
             let r =
                 tvix_store::nar::seekable::Reader::new(root_node, blob_service, directory_service)
                     .await