Lazy create StaticFileMiddleware statemachine (#9507)
This commit is contained in:
parent
c84e37f30d
commit
507a765dfb
|
|
@ -103,7 +103,6 @@ namespace Microsoft.AspNetCore.StaticFiles
|
||||||
public partial class StaticFileMiddleware
|
public partial class StaticFileMiddleware
|
||||||
{
|
{
|
||||||
public StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
public StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
||||||
[System.Diagnostics.DebuggerStepThroughAttribute]
|
|
||||||
public System.Threading.Tasks.Task Invoke(Microsoft.AspNetCore.Http.HttpContext context) { throw null; }
|
public System.Threading.Tasks.Task Invoke(Microsoft.AspNetCore.Http.HttpContext context) { throw null; }
|
||||||
}
|
}
|
||||||
public partial class StaticFileResponseContext
|
public partial class StaticFileResponseContext
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.StaticFiles
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task Invoke(HttpContext context)
|
public Task Invoke(HttpContext context)
|
||||||
{
|
{
|
||||||
var fileContext = new StaticFileContext(context, _options, _matchUrl, _logger, _fileProvider, _contentTypeProvider);
|
var fileContext = new StaticFileContext(context, _options, _matchUrl, _logger, _fileProvider, _contentTypeProvider);
|
||||||
|
|
||||||
|
|
@ -95,52 +95,58 @@ namespace Microsoft.AspNetCore.StaticFiles
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If we get here, we can try to serve the file
|
// If we get here, we can try to serve the file
|
||||||
fileContext.ComprehendRequestHeaders();
|
return ServeStaticFile(context, fileContext);
|
||||||
switch (fileContext.GetPreconditionState())
|
|
||||||
{
|
|
||||||
case StaticFileContext.PreconditionState.Unspecified:
|
|
||||||
case StaticFileContext.PreconditionState.ShouldProcess:
|
|
||||||
if (fileContext.IsHeadMethod)
|
|
||||||
{
|
|
||||||
await fileContext.SendStatusAsync(Constants.Status200Ok);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (fileContext.IsRangeRequest)
|
|
||||||
{
|
|
||||||
await fileContext.SendRangeAsync();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await fileContext.SendAsync();
|
|
||||||
_logger.FileServed(fileContext.SubPath, fileContext.PhysicalPath);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (FileNotFoundException)
|
|
||||||
{
|
|
||||||
context.Response.Clear();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case StaticFileContext.PreconditionState.NotModified:
|
|
||||||
_logger.FileNotModified(fileContext.SubPath);
|
|
||||||
await fileContext.SendStatusAsync(Constants.Status304NotModified);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case StaticFileContext.PreconditionState.PreconditionFailed:
|
|
||||||
_logger.PreconditionFailed(fileContext.SubPath);
|
|
||||||
await fileContext.SendStatusAsync(Constants.Status412PreconditionFailed);
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
|
||||||
var exception = new NotImplementedException(fileContext.GetPreconditionState().ToString());
|
|
||||||
Debug.Fail(exception.ToString());
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _next(context);
|
return _next(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ServeStaticFile(HttpContext context, StaticFileContext fileContext)
|
||||||
|
{
|
||||||
|
fileContext.ComprehendRequestHeaders();
|
||||||
|
switch (fileContext.GetPreconditionState())
|
||||||
|
{
|
||||||
|
case StaticFileContext.PreconditionState.Unspecified:
|
||||||
|
case StaticFileContext.PreconditionState.ShouldProcess:
|
||||||
|
if (fileContext.IsHeadMethod)
|
||||||
|
{
|
||||||
|
await fileContext.SendStatusAsync(Constants.Status200Ok);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (fileContext.IsRangeRequest)
|
||||||
|
{
|
||||||
|
await fileContext.SendRangeAsync();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await fileContext.SendAsync();
|
||||||
|
_logger.FileServed(fileContext.SubPath, fileContext.PhysicalPath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException)
|
||||||
|
{
|
||||||
|
context.Response.Clear();
|
||||||
|
}
|
||||||
|
await _next(context);
|
||||||
|
return;
|
||||||
|
case StaticFileContext.PreconditionState.NotModified:
|
||||||
|
_logger.FileNotModified(fileContext.SubPath);
|
||||||
|
await fileContext.SendStatusAsync(Constants.Status304NotModified);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case StaticFileContext.PreconditionState.PreconditionFailed:
|
||||||
|
_logger.PreconditionFailed(fileContext.SubPath);
|
||||||
|
await fileContext.SendStatusAsync(Constants.Status412PreconditionFailed);
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
var exception = new NotImplementedException(fileContext.GetPreconditionState().ToString());
|
||||||
|
Debug.Fail(exception.ToString());
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue