about summary refs log tree commit diff
path: root/tvix/nar-bridge
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/nar-bridge')
-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