Skip to content

A .NET library that extends the content-type/MIME-type mappings for serving static files which have been compressed.

Notifications You must be signed in to change notification settings

colinwilliams91/StaticFileOptionsExtender

Repository files navigation

Static File Options Extender

Purpose:

  1. Enable .NET applications to serve static files which have been compressed via gzip and/or brotli
    compression algorithms, correctly mapping their original file's content-types and response headers.
  2. Allow user to extend the Options Class to add additional compression types and configure mappings.

To Use:

  1. Leverage the package's static using directive*
  2. Call the package's GetOptions method as the argument to UseStaticFiles(...)*
    this will pass the extended StaticFileOptions while building the request pipeline.
using static CWDev.StaticFileOptionsExtender;      // <-- *

var builder = WebApplication.CreateBuilder(args);

// ...

var app = builder.Build();

// ...

app.UseStaticFiles(GetOptions());                  // <-- *

Abstract:

.NET WebApplicationBuilder can be leveraged to configure the application HTTP Request Pipeline.
Within that Pipeline StaticFileMiddleware can be used to serve static files.

Typically, the app.UseStaticFiles(StaticFileOptions options) middleware configures a few key
steps. This library is mostly concerned with TWO -- Providers and Handlers -- regarding:

  • Mapping files content-types:
    • IContentTypeProvider StaticFileOptions.ContentTypeProvider*
  • Adding or changing the response headers:
    • Action<StaticFileResponseContext> StaticFileOptions.OnPrepareResponse*

StaticFileOptions StaticFileOptionsExtender.GetOptions

public static StaticFileOptions GetOptions()
{
    var customFileTypeProvider = new CustomContentTypeProvider();
    return new StaticFileOptions
    {
        ContentTypeProvider = customFileTypeProvider,                // <-- *
        OnPrepareResponse = (StaticFileResponseContext context) =>   // <-- *
        {
            if (CompressionEncodings.TryGetValue(Path.GetExtension(context.File.Name), out string? encoding))
            {
                context.Context.Response.Headers.ContentEncoding = encoding;
            }
        }
    };
}

Specifically, StaticFileOptionsExtender leverages a class inheriting from IContentTypeProvider
to extend the MIME type mappings for the 380 most commonly used file types (default).
This library originally was built to enable .NET to serve static files which have been compressed for WebGL
by building from Unity.

Overview:

Release-Notes:

Contribute:

  • Please open a GitHub Issue with concerns.
  • Open a PR if you have a code proposal.
  • I will respond in <=24 hours with thoughts and/or solution.