Skip to content

Commit 1278001

Browse files
Merge pull request #197 from SixLabors/js/fix-195
Ensure invalid format commands don't get processed.
2 parents fea0207 + e070b9e commit 1278001

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

src/ImageSharp.Web/FormatUtilities.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,26 @@ public FormatUtilities(IOptions<ImageSharpMiddlewareOptions> options)
5151
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5252
public string GetExtensionFromUri(string uri)
5353
{
54+
// TODO: This method should follow TryGet pattern. Fix for V2.
5455
int query = uri.IndexOf('?');
5556
ReadOnlySpan<char> path;
5657

5758
if (query > -1)
5859
{
59-
if (uri.Contains(FormatWebProcessor.Format, StringComparison.OrdinalIgnoreCase) && QueryHelpers.ParseQuery(uri.Substring(query)).TryGetValue(FormatWebProcessor.Format, out StringValues ext))
60+
if (uri.Contains(FormatWebProcessor.Format, StringComparison.OrdinalIgnoreCase)
61+
&& QueryHelpers.ParseQuery(uri.Substring(query)).TryGetValue(FormatWebProcessor.Format, out StringValues ext))
6062
{
61-
return ext;
63+
// We have a query but is it a valid one?
64+
ReadOnlySpan<char> extSpan = ext[0].AsSpan();
65+
foreach (string extension in this.extensions)
66+
{
67+
if (extSpan.Equals(extension, StringComparison.OrdinalIgnoreCase))
68+
{
69+
return extension;
70+
}
71+
}
72+
73+
return null;
6274
}
6375

6476
path = uri.AsSpan(0, query);

src/ImageSharp.Web/Middleware/ImageSharpMiddleware.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the Apache License, Version 2.0.
33

44
using System;
5-
using System.Collections.Concurrent;
65
using System.Collections.Generic;
76
using System.Diagnostics;
87
using System.Globalization;

src/ImageSharp.Web/Processors/FormatWebProcessor.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ private static readonly IEnumerable<string> FormatCommands
3737
/// </summary>
3838
/// <param name="options">The middleware configuration options.</param>
3939
public FormatWebProcessor(IOptions<ImageSharpMiddlewareOptions> options)
40-
{
41-
this.options = options.Value;
42-
}
40+
=> this.options = options.Value;
4341

4442
/// <inheritdoc/>
4543
public IEnumerable<string> Commands { get; } = FormatCommands;

tests/ImageSharp.Web.Tests/Helpers/FormatUtilitiesTests.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class FormatUtilitiesTests
1414
public static IEnumerable<object[]> DefaultExtensions =
1515
Configuration.Default.ImageFormats.SelectMany(f => f.FileExtensions.Select(e => new object[] { e, e }));
1616

17-
private static readonly FormatUtilities FormatUtilities = new FormatUtilities(Options.Create(new ImageSharpMiddlewareOptions()));
17+
private static readonly FormatUtilities FormatUtilities = new(Options.Create(new ImageSharpMiddlewareOptions()));
1818

1919
[Theory]
2020
[MemberData(nameof(DefaultExtensions))]
@@ -27,22 +27,29 @@ public void GetExtensionShouldMatchDefaultExtensions(string expected, string ext
2727
[Fact]
2828
public void GetExtensionShouldNotMatchExtensionWithoutDotPrefix()
2929
{
30-
const string Uri = "http://www.example.org/some/path/to/bmpimage";
31-
Assert.Null(FormatUtilities.GetExtensionFromUri(Uri));
30+
const string uri = "http://www.example.org/some/path/to/bmpimage";
31+
Assert.Null(FormatUtilities.GetExtensionFromUri(uri));
3232
}
3333

3434
[Fact]
3535
public void GetExtensionShouldIgnoreQueryStringWithoutFormatParamter()
3636
{
37-
const string Uri = "http://www.example.org/some/path/to/image.bmp?width=300&foo=.png";
38-
Assert.Equal("bmp", FormatUtilities.GetExtensionFromUri(Uri));
37+
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&foo=.png";
38+
Assert.Equal("bmp", FormatUtilities.GetExtensionFromUri(uri));
3939
}
4040

4141
[Fact]
4242
public void GetExtensionShouldAcknowledgeQueryStringFormatParameter()
4343
{
44-
const string Uri = "http://www.example.org/some/path/to/image.bmp?width=300&format=png";
45-
Assert.Equal("png", FormatUtilities.GetExtensionFromUri(Uri));
44+
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&format=png";
45+
Assert.Equal("png", FormatUtilities.GetExtensionFromUri(uri));
46+
}
47+
48+
[Fact]
49+
public void GetExtensionShouldRejectInvalidQueryStringFormatParameter()
50+
{
51+
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&format=invalid";
52+
Assert.Null(FormatUtilities.GetExtensionFromUri(uri));
4653
}
4754
}
4855
}

0 commit comments

Comments
 (0)