Skip to content

Commit

Permalink
Merge pull request #202 from SixLabors/js/format-utils-api
Browse files Browse the repository at this point in the history
Fix method signature
  • Loading branch information
JimBobSquarePants authored Jan 18, 2022
2 parents b762e04 + 332af4f commit 7c2b496
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public async Task<IImageResolver> GetAsync(HttpContext context)

/// <inheritdoc/>
public bool IsValidRequest(HttpContext context)
=> this.formatUtilities.GetExtensionFromUri(context.Request.GetDisplayUrl()) != null;
=> this.formatUtilities.TryGetExtensionFromUri(context.Request.GetDisplayUrl(), out _);

private bool IsMatch(HttpContext context)
{
Expand Down
31 changes: 20 additions & 11 deletions src/ImageSharp.Web/FormatUtilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,18 @@ public FormatUtilities(IOptions<ImageSharpMiddlewareOptions> options)
/// Gets the file extension for the given image uri.
/// </summary>
/// <param name="uri">The full request uri.</param>
/// <returns>The <see cref="string" />.</returns>
/// <param name="extension">
/// When this method returns, contains the file extension for the image source,
/// if the path exists; otherwise, the default value for the type of the path parameter.
/// This parameter is passed uninitialized.
/// </param>
/// <returns>
/// <see langword="true" /> if the uri contains an extension; otherwise, <see langword="false" />.
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string GetExtensionFromUri(string uri)
public bool TryGetExtensionFromUri(string uri, out string extension)
{
// TODO: This method should follow TryGet pattern. Fix for V2.
extension = null;
int query = uri.IndexOf('?');
ReadOnlySpan<char> path;

Expand All @@ -62,15 +69,16 @@ public string GetExtensionFromUri(string uri)
{
// We have a query but is it a valid one?
ReadOnlySpan<char> extSpan = ext[0].AsSpan();
foreach (string extension in this.extensions)
foreach (string e in this.extensions)
{
if (extSpan.Equals(extension, StringComparison.OrdinalIgnoreCase))
if (extSpan.Equals(e, StringComparison.OrdinalIgnoreCase))
{
return extension;
extension = e;
return true;
}
}

return null;
return false;
}

path = uri.AsSpan(0, query);
Expand All @@ -85,16 +93,17 @@ public string GetExtensionFromUri(string uri)
{
ReadOnlySpan<char> pathExtension = path.Slice(extensionIndex + 1);

foreach (string extension in this.extensions)
foreach (string e in this.extensions)
{
if (pathExtension.Equals(extension, StringComparison.OrdinalIgnoreCase))
if (pathExtension.Equals(e, StringComparison.OrdinalIgnoreCase))
{
return extension;
extension = e;
return true;
}
}
}

return null;
return false;
}

/// <summary>
Expand Down
3 changes: 2 additions & 1 deletion src/ImageSharp.Web/Providers/PhysicalFileSystemProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ public PhysicalFileSystemProvider(
public Func<HttpContext, bool> Match { get; set; } = _ => true;

/// <inheritdoc/>
public bool IsValidRequest(HttpContext context) => this.formatUtilities.GetExtensionFromUri(context.Request.GetDisplayUrl()) != null;
public bool IsValidRequest(HttpContext context)
=> this.formatUtilities.TryGetExtensionFromUri(context.Request.GetDisplayUrl(), out _);

/// <inheritdoc/>
public Task<IImageResolver> GetAsync(HttpContext context)
Expand Down
13 changes: 8 additions & 5 deletions tests/ImageSharp.Web.Tests/Helpers/FormatUtilitiesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,38 @@ public class FormatUtilitiesTests
public void GetExtensionShouldMatchDefaultExtensions(string expected, string ext)
{
string uri = $"http://www.example.org/some/path/to/image.{ext}?width=300";
Assert.Equal(expected, FormatUtilities.GetExtensionFromUri(uri));
FormatUtilities.TryGetExtensionFromUri(uri, out string actual);
Assert.Equal(expected, actual);
}

[Fact]
public void GetExtensionShouldNotMatchExtensionWithoutDotPrefix()
{
const string uri = "http://www.example.org/some/path/to/bmpimage";
Assert.Null(FormatUtilities.GetExtensionFromUri(uri));
Assert.False(FormatUtilities.TryGetExtensionFromUri(uri, out _));
}

[Fact]
public void GetExtensionShouldIgnoreQueryStringWithoutFormatParamter()
{
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&foo=.png";
Assert.Equal("bmp", FormatUtilities.GetExtensionFromUri(uri));
FormatUtilities.TryGetExtensionFromUri(uri, out string actual);
Assert.Equal("bmp", actual);
}

[Fact]
public void GetExtensionShouldAcknowledgeQueryStringFormatParameter()
{
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&format=png";
Assert.Equal("png", FormatUtilities.GetExtensionFromUri(uri));
FormatUtilities.TryGetExtensionFromUri(uri, out string actual);
Assert.Equal("png", actual);
}

[Fact]
public void GetExtensionShouldRejectInvalidQueryStringFormatParameter()
{
const string uri = "http://www.example.org/some/path/to/image.bmp?width=300&format=invalid";
Assert.Null(FormatUtilities.GetExtensionFromUri(uri));
Assert.False(FormatUtilities.TryGetExtensionFromUri(uri, out _));
}
}
}

0 comments on commit 7c2b496

Please sign in to comment.