diff options
author | Florian Klink <flokli@flokli.de> | 2024-08-23T07·34+0300 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2024-08-23T15·02+0000 |
commit | a4ebc8da7cd7232bb709ffa083547431ba65f08c (patch) | |
tree | 6ccb32f6fb3b0f8984736cce7368a393b435ab40 | |
parent | 35d5811eec4f2d610e811d24b412aa05479a7358 (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.rs | 13 | ||||
-rw-r--r-- | tvix/nar-bridge/src/nar.rs | 1 | ||||
-rw-r--r-- | tvix/nar-bridge/src/narinfo.rs | 13 |
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))] |