Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Netclaw.Actors.Tests/Tools/WebFetchToolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,7 @@ public void GetExtensionFromUrl_extracts_extension(string url, string? expected)
[InlineData("application/pdf", true, ".pdf")]
[InlineData("application/json", false, ".json")]
[InlineData("text/csv", false, ".csv")]
[InlineData("text/tab-separated-values", false, ".tsv")]
[InlineData("image/png", true, ".png")]
[InlineData("text/plain", false, ".txt")]
public void GetFallbackExtension_returns_correct_extension(string contentType, bool isBinary, string expected)
Expand Down
3 changes: 3 additions & 0 deletions src/Netclaw.Media/MimeTypeCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public static class MimeTypeCatalog
public const string TextPlain = "text/plain";
public const string TextMarkdown = "text/markdown";
public const string TextCsv = "text/csv";
public const string TextTsv = "text/tab-separated-values";
public const string TextHtml = "text/html";
public const string ApplicationJson = "application/json";
public const string ApplicationXml = "application/xml";
Expand Down Expand Up @@ -222,6 +223,7 @@ private static MediaTypeDefinition[] BuildDefinitions() =>
Text(TextPlain, ".txt", ".txt", ".log"),
Text(TextMarkdown, ".md", ".md", ".markdown"),
Text(TextCsv, ".csv", ".csv"),
Text(TextTsv, ".tsv", ".tsv"),
Text(TextHtml, ".html", ".html", ".htm"),
Text(ApplicationJson, ".json", ".json"),
Text(ApplicationXml, ".xml", ".xml"),
Expand Down Expand Up @@ -281,6 +283,7 @@ private static MediaTypeDefinition DefinitionsByCanonical(string mimeType) =>
[(".yaml", TextPlain)] = ApplicationYaml,
[(".yml", TextPlain)] = ApplicationYaml,
[(".csv", TextPlain)] = TextCsv,
[(".tsv", TextPlain)] = TextTsv,
[(".xml", TextPlain)] = ApplicationXml,
[(".html", TextPlain)] = TextHtml,
[(".htm", TextPlain)] = TextHtml
Expand Down
4 changes: 3 additions & 1 deletion src/Netclaw.Security.Tests/MagicByteValidatorTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// <copyright file="MagicByteValidatorTests.cs" company="Petabridge, LLC">
// Copyright (C) 2026 - 2026 Petabridge, LLC <https://petabridge.com>
// </copyright>
Expand Down Expand Up @@ -143,6 +143,7 @@ public void Validate_DocxWithOleHeader_MimeTypeMismatch()
[InlineData(nameof(PlainTextBytes), "text/plain", "notes.txt")]
[InlineData(nameof(PlainTextBytes), "text/markdown", "readme.md")]
[InlineData(nameof(PlainTextBytes), "text/csv", "data.csv")]
[InlineData(nameof(PlainTextBytes), "text/tab-separated-values", "data.tsv")]
public void Validate_TextContentWithMatchingMime_Allowed(string headerField, string mime, string filename)
{
var header = ResolveHeader(headerField);
Expand Down Expand Up @@ -189,6 +190,7 @@ public void Validate_MarkdownDeclaredAsTextPlain_NormalizesAndAllows(string file
[InlineData("config.yaml")]
[InlineData("config.yml")]
[InlineData("data.csv")]
[InlineData("data.tsv")]
[InlineData("doc.xml")]
public void Validate_StructuredTextDeclaredAsTextPlain_NormalizesAndAllows(string filename)
{
Expand Down
3 changes: 2 additions & 1 deletion src/Netclaw.Security/MagicByteValidator.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// <copyright file="MagicByteValidator.cs" company="Petabridge, LLC">
// Copyright (C) 2026 - 2026 Petabridge, LLC <https://petabridge.com>
// </copyright>
Expand Down Expand Up @@ -255,6 +255,7 @@ public static bool HasExecutableSignature(ReadOnlySpan<byte> content)
["text/plain"] = AnyContent,
["text/markdown"] = AnyContent,
["text/csv"] = AnyContent,
["text/tab-separated-values"] = AnyContent,
["text/html"] = AnyContent,
["application/json"] = AnyContent,
["application/xml"] = AnyContent,
Expand Down
Loading