feat(tvix/nar-bridge): send content-type headers

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>
This commit is contained in:
Florian Klink 2024-08-23 10:34:53 +03:00 committed by clbot
parent 35d5811eec
commit a4ebc8da7c
3 changed files with 18 additions and 9 deletions

View file

@ -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))]