about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2024-08-23T07·34+0300
committerclbot <clbot@tvl.fyi>2024-08-23T15·02+0000
commita4ebc8da7cd7232bb709ffa083547431ba65f08c (patch)
tree6ccb32f6fb3b0f8984736cce7368a393b435ab40
parent35d5811eec4f2d610e811d24b412aa05479a7358 (diff)
feat(tvix/nar-bridge): send content-type headers r/8561
This prevents browsers from treating NARInfo and nix-cache-info paths as
a separate "Download", but just show it in plaintext.

Change-Id: If99abe20ef1d24e4fa86c055160861ca47aa81ce
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12267
Tested-by: BuildkiteCI
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: Connor Brewster <cbrewster@hey.com>
-rw-r--r--tvix/nar-bridge/src/lib.rs13
-rw-r--r--tvix/nar-bridge/src/nar.rs1
-rw-r--r--tvix/nar-bridge/src/narinfo.rs13
3 files changed, 18 insertions, 9 deletions
diff --git a/tvix/nar-bridge/src/lib.rs b/tvix/nar-bridge/src/lib.rs
index 56b7e19a3cb0..79f9b7372245 100644
--- a/tvix/nar-bridge/src/lib.rs
+++ b/tvix/nar-bridge/src/lib.rs
@@ -1,7 +1,9 @@
 use axum::http::StatusCode;
+use axum::response::IntoResponse;
 use axum::routing::{head, put};
 use axum::{routing::get, Router};
 use lru::LruCache;
+use nix_compat::nix_http;
 use parking_lot::RwLock;
 use std::num::NonZeroUsize;
 use std::sync::Arc;
@@ -71,9 +73,12 @@ async fn four_o_four() -> Result<(), StatusCode> {
     Err(StatusCode::NOT_FOUND)
 }
 
-async fn nix_cache_info(priority: u64) -> String {
-    format!(
-        "StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {}\n",
-        priority
+async fn nix_cache_info(priority: u64) -> impl IntoResponse {
+    (
+        [("Content-Type", nix_http::MIME_TYPE_CACHE_INFO)],
+        format!(
+            "StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {}\n",
+            priority
+        ),
     )
 }
diff --git a/tvix/nar-bridge/src/nar.rs b/tvix/nar-bridge/src/nar.rs
index f4471e0735f1..70d9d644c26c 100644
--- a/tvix/nar-bridge/src/nar.rs
+++ b/tvix/nar-bridge/src/nar.rs
@@ -77,6 +77,7 @@ pub async fn get(
         .status(StatusCode::OK)
         .header("cache-control", "max-age=31536000, immutable")
         .header("content-length", nar_size)
+        .header("content-type", nix_http::MIME_TYPE_NAR)
         .body(Body::from_stream(ReaderStream::new(r)))
         .unwrap())
 }
diff --git a/tvix/nar-bridge/src/narinfo.rs b/tvix/nar-bridge/src/narinfo.rs
index afc4e650cbc6..fc90f0b86629 100644
--- a/tvix/nar-bridge/src/narinfo.rs
+++ b/tvix/nar-bridge/src/narinfo.rs
@@ -1,4 +1,4 @@
-use axum::http::StatusCode;
+use axum::{http::StatusCode, response::IntoResponse};
 use bytes::Bytes;
 use nix_compat::{narinfo::NarInfo, nix_http, nixbase32};
 use prost::Message;
@@ -17,7 +17,7 @@ pub async fn head(
     axum::extract::State(AppState {
         path_info_service, ..
     }): axum::extract::State<AppState>,
-) -> Result<&'static str, StatusCode> {
+) -> Result<impl IntoResponse, StatusCode> {
     let digest = nix_http::parse_narinfo_str(&narinfo_str).ok_or(StatusCode::NOT_FOUND)?;
     Span::current().record("path_info.digest", &narinfo_str[0..32]);
 
@@ -30,7 +30,7 @@ pub async fn head(
         })?
         .is_some()
     {
-        Ok("")
+        Ok(([("content-type", nix_http::MIME_TYPE_NARINFO)], ""))
     } else {
         warn!("PathInfo not found");
         Err(StatusCode::NOT_FOUND)
@@ -43,7 +43,7 @@ pub async fn get(
     axum::extract::State(AppState {
         path_info_service, ..
     }): axum::extract::State<AppState>,
-) -> Result<String, StatusCode> {
+) -> Result<impl IntoResponse, StatusCode> {
     let digest = nix_http::parse_narinfo_str(&narinfo_str).ok_or(StatusCode::NOT_FOUND)?;
     Span::current().record("path_info.digest", &narinfo_str[0..32]);
 
@@ -88,7 +88,10 @@ pub async fn get(
 
     narinfo.url = &url;
 
-    Ok(narinfo.to_string())
+    Ok((
+        [("content-type", nix_http::MIME_TYPE_NARINFO)],
+        narinfo.to_string(),
+    ))
 }
 
 #[instrument(skip(path_info_service, root_nodes, request))]