From 539481f99935f3bcbe66e8bc514922e7f67dac8f Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 03:47:08 +0000 Subject: [PATCH] Validate mimeType in ImageContentBlock.FromBytes and AudioContentBlock.FromBytes (#1321) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> --- .../Protocol/ContentBlock.cs | 10 ++++++++-- .../Protocol/ContentBlockTests.cs | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs b/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs index d31936b..7d35cec 100644 --- a/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs +++ b/src/ModelContextProtocol.Core/Protocol/ContentBlock.cs @@ -425,9 +425,12 @@ public sealed class ImageContentBlock : ContentBlock /// /// This method stores the provided bytes as and encodes them to base64 UTF-8 bytes for . /// - /// + /// is . + /// is empty or composed entirely of whitespace. public static ImageContentBlock FromBytes(ReadOnlyMemory bytes, string mimeType) { + Throw.IfNullOrWhiteSpace(mimeType); + ReadOnlyMemory data = EncodingUtilities.EncodeToBase64Utf8(bytes); return new() @@ -510,9 +513,12 @@ public sealed class AudioContentBlock : ContentBlock /// /// This method stores the provided bytes as and encodes them to base64 UTF-8 bytes for . /// - /// + /// is . + /// is empty or composed entirely of whitespace. public static AudioContentBlock FromBytes(ReadOnlyMemory bytes, string mimeType) { + Throw.IfNullOrWhiteSpace(mimeType); + ReadOnlyMemory data = EncodingUtilities.EncodeToBase64Utf8(bytes); return new() diff --git a/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs b/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs index 2dfcf7d..957a452 100644 --- a/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs +++ b/tests/ModelContextProtocol.Tests/Protocol/ContentBlockTests.cs @@ -272,4 +272,22 @@ public class ContentBlockTests Assert.Equal("Paris", result.Input.GetProperty("city").GetString()); Assert.Equal("metric", result.Input.GetProperty("units").GetString()); } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + public void ImageContentBlock_FromBytes_ThrowsForNullOrWhiteSpaceMimeType(string? mimeType) + { + Assert.ThrowsAny(() => ImageContentBlock.FromBytes((byte[])[1, 2, 3], mimeType!)); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + public void AudioContentBlock_FromBytes_ThrowsForNullOrWhiteSpaceMimeType(string? mimeType) + { + Assert.ThrowsAny(() => AudioContentBlock.FromBytes((byte[])[1, 2, 3], mimeType!)); + } } \ No newline at end of file