The opaque content type is one core constant: local::OPAQUE_MIME

"application/octet-stream" was written out in the blob server, its test, the
store's normalize_mime and the wire default. All four now read OPAQUE_MIME; the
schema's SQL column default names the same string and says so.

DRY pass #2, batch 2, F7 (#5372).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 14:20:01 -04:00
co-authored by Claude Opus 5.5
parent 4ac15d3557
commit fe84924f78
4 changed files with 14 additions and 5 deletions
+5
View File
@@ -24,6 +24,11 @@ pub const DB_FILE: &str = "inkwell.db";
/// Attachment bytes, filed by content hash, beside [`DB_FILE`]. /// Attachment bytes, filed by content hash, beside [`DB_FILE`].
pub const BLOBS_DIR: &str = "blobs"; pub const BLOBS_DIR: &str = "blobs";
/// The type of bytes whose type isn't known, or isn't safe to say: stored for an
/// attachment that declared none, and served for one that can't be shown inline.
/// The schema's column default (`schema.rs`) is the same string, in SQL.
pub const OPAQUE_MIME: &str = "application/octet-stream";
/// An instant in the store's own form: RFC 3339, UTC, milliseconds, `Z`. Every /// An instant in the store's own form: RFC 3339, UTC, milliseconds, `Z`. Every
/// stored time is written this way, which is what makes lexical order chronological. /// stored time is written this way, which is what makes lexical order chronological.
pub fn iso(t: DateTime<Utc>) -> String { pub fn iso(t: DateTime<Utc>) -> String {
+2 -2
View File
@@ -15,7 +15,7 @@ use uuid::Uuid;
use crate::local::derive; use crate::local::derive;
use crate::local::models::*; use crate::local::models::*;
use crate::local::recur; use crate::local::recur;
use crate::local::{iso, now}; use crate::local::{iso, now, OPAQUE_MIME};
fn new_id() -> String { fn new_id() -> String {
Uuid::new_v4().to_string() Uuid::new_v4().to_string()
@@ -792,7 +792,7 @@ fn normalize_mime(raw: &str) -> String {
.trim() .trim()
.to_ascii_lowercase(); .to_ascii_lowercase();
if bare.is_empty() { if bare.is_empty() {
"application/octet-stream".to_string() OPAQUE_MIME.to_string()
} else { } else {
bare bare
} }
+4 -2
View File
@@ -12,6 +12,8 @@ use std::fs;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::OnceLock; use std::sync::OnceLock;
use crate::local::OPAQUE_MIME;
/// A sha256 in lowercase hex, and nothing else. /// A sha256 in lowercase hex, and nothing else.
/// ///
/// This is a **path-safety** check, not a formatting nicety: the hash is taken /// This is a **path-safety** check, not a formatting nicety: the hash is taken
@@ -189,7 +191,7 @@ fn content_type_for(mime: &str) -> String {
if familiar && printable { if familiar && printable {
mime.to_string() mime.to_string()
} else { } else {
"application/octet-stream".to_string() OPAQUE_MIME.to_string()
} }
} }
@@ -306,7 +308,7 @@ mod tests {
fn a_scriptable_type_is_served_as_a_download() { fn a_scriptable_type_is_served_as_a_download() {
// This scheme is an origin of its own. An attachment claiming to be HTML // This scheme is an origin of its own. An attachment claiming to be HTML
// must not be handed back as a document that can run there. // must not be handed back as a document that can run there.
let opaque = "application/octet-stream"; let opaque = OPAQUE_MIME;
assert_eq!(content_type_for("text/html"), opaque); assert_eq!(content_type_for("text/html"), opaque);
assert_eq!(content_type_for("application/javascript"), opaque); assert_eq!(content_type_for("application/javascript"), opaque);
// An image family member that is really a document with script in it. // An image family member that is really a document with script in it.
+3 -1
View File
@@ -8,6 +8,8 @@
use serde::Deserialize; use serde::Deserialize;
use crate::local::OPAQUE_MIME;
#[derive(Debug, Clone, Deserialize, Default)] #[derive(Debug, Clone, Deserialize, Default)]
pub struct ChangesPage { pub struct ChangesPage {
#[serde(default)] #[serde(default)]
@@ -161,5 +163,5 @@ fn default_color() -> String {
} }
fn default_mime() -> String { fn default_mime() -> String {
"application/octet-stream".to_string() OPAQUE_MIME.to_string()
} }