adding some logging statements

This commit is contained in:
SonjaKhan 2014-11-11 17:26:32 -08:00
parent 3343bb4d23
commit e94e3dc44e
7 changed files with 65 additions and 11 deletions

View File

@ -1,13 +1,18 @@
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.FileSystems;
using Microsoft.AspNet.StaticFiles;
using Microsoft.Framework.Logging;
using Microsoft.Framework.Logging.Console;
namespace StaticFilesSample
{
public class Startup
{
public void Configure(IApplicationBuilder app)
public void Configure(IApplicationBuilder app, ILoggerFactory factory)
{
// Displays all log levels
factory.AddConsole(LogLevel.Verbose);
app.UseFileServer(new FileServerOptions()
{
EnableDirectoryBrowsing = true,

View File

@ -12,6 +12,7 @@
</PropertyGroup>
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<DevelopmentServerPort>16758</DevelopmentServerPort>
</PropertyGroup>
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

View File

@ -3,10 +3,11 @@
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.Urls http://localhost:12345/"
},
"dependencies": {
"Kestrel": "1.0.0-*",
"Microsoft.AspNet.Server.IIS": "1.0.0-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-*",
"Kestrel": "1.0.0-*",
"Microsoft.AspNet.StaticFiles": "1.0.0-*"
"Microsoft.AspNet.StaticFiles": "1.0.0-*",
"Microsoft.Framework.Logging.Console": "1.0.0-*"
},
"frameworks": {
"aspnet50": { },

View File

@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.HttpFeature;
using Microsoft.Framework.Logging;
namespace Microsoft.AspNet.StaticFiles
{
@ -20,14 +21,17 @@ namespace Microsoft.AspNet.StaticFiles
public class SendFileMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
/// <summary>
/// Creates a new instance of the SendFileMiddleware.
/// </summary>
/// <param name="next">The next middleware in the pipeline.</param>
public SendFileMiddleware([NotNull] RequestDelegate next)
/// <param name="loggerFactory">An <see cref="ILoggerFactory"/> instance used to create loggers.</param>
public SendFileMiddleware([NotNull] RequestDelegate next, [NotNull] ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory.Create<SendFileMiddleware>();
}
public Task Invoke(HttpContext context)
@ -35,7 +39,7 @@ namespace Microsoft.AspNet.StaticFiles
// Check if there is a SendFile feature already present
if (context.GetFeature<IHttpSendFileFeature>() == null)
{
context.SetFeature<IHttpSendFileFeature>(new SendFileWrapper(context.Response.Body));
context.SetFeature<IHttpSendFileFeature>(new SendFileWrapper(context.Response.Body, _logger));
}
return _next(context);
@ -44,10 +48,12 @@ namespace Microsoft.AspNet.StaticFiles
private class SendFileWrapper : IHttpSendFileFeature
{
private readonly Stream _output;
private readonly ILogger _logger;
internal SendFileWrapper(Stream output)
internal SendFileWrapper(Stream output, ILogger logger)
{
_output = output;
_logger = logger;
}
// Not safe for overlapped writes.
@ -86,6 +92,10 @@ namespace Microsoft.AspNet.StaticFiles
try
{
fileStream.Seek(offset, SeekOrigin.Begin);
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("Copying bytes {0}-{1} of file {2} to response body", offset, length != null ? (offset + length).ToString() : "*", fileName));
}
await StreamCopyOperation.CopyToAsync(fileStream, _output, length, cancel);
}
finally

View File

@ -11,6 +11,7 @@ using Microsoft.AspNet.FileSystems;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.HttpFeature;
using Microsoft.AspNet.StaticFiles.Infrastructure;
using Microsoft.Framework.Logging;
namespace Microsoft.AspNet.StaticFiles
{
@ -21,6 +22,7 @@ namespace Microsoft.AspNet.StaticFiles
private readonly PathString _matchUrl;
private readonly HttpRequest _request;
private readonly HttpResponse _response;
private readonly ILogger _logger;
private string _method;
private bool _isGet;
private bool _isHead;
@ -40,13 +42,14 @@ namespace Microsoft.AspNet.StaticFiles
private IList<Tuple<long, long>> _ranges;
public StaticFileContext(HttpContext context, StaticFileOptions options, PathString matchUrl)
public StaticFileContext(HttpContext context, StaticFileOptions options, PathString matchUrl, ILogger logger)
{
_context = context;
_options = options;
_matchUrl = matchUrl;
_request = context.Request;
_response = context.Response;
_logger = logger;
_method = null;
_isGet = false;
@ -83,6 +86,11 @@ namespace Microsoft.AspNet.StaticFiles
{
get { return _ranges != null; }
}
public string SubPath
{
get { return _subPath.Value; }
}
public bool ValidateMethod()
{
@ -220,6 +228,7 @@ namespace Microsoft.AspNet.StaticFiles
if (ranges.Count > 1)
{
// multiple range headers not yet supported
_logger.WriteWarning("Multiple range headers not yet supported, {0} ranges in header", ranges.Count.ToString());
return;
}
@ -308,6 +317,10 @@ namespace Microsoft.AspNet.StaticFiles
{
ApplyResponseHeaders(statusCode);
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("Handled. Status code: {0} File: {1}", statusCode, SubPath));
}
return Constants.CompletedTask;
}
@ -350,6 +363,7 @@ namespace Microsoft.AspNet.StaticFiles
// the current length of the selected resource. e.g. */length
_response.Headers[Constants.ContentRange] = "bytes */" + _length.ToString(CultureInfo.InvariantCulture);
ApplyResponseHeaders(Constants.Status416RangeNotSatisfiable);
_logger.WriteWarning("Range not satisfiable for {0}", SubPath);
return;
}
@ -365,6 +379,10 @@ namespace Microsoft.AspNet.StaticFiles
var sendFile = _context.GetFeature<IHttpSendFileFeature>();
if (sendFile != null && !string.IsNullOrEmpty(physicalPath))
{
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("Sending {0} of file {1}", _response.Headers[Constants.ContentRange], physicalPath));
}
await sendFile.SendFileAsync(physicalPath, start, length, _context.RequestAborted);
return;
}
@ -373,6 +391,10 @@ namespace Microsoft.AspNet.StaticFiles
try
{
readStream.Seek(start, SeekOrigin.Begin); // TODO: What if !CanSeek?
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("Copying {0} of file {1} to the response body", _response.Headers[Constants.ContentRange], SubPath));
}
await StreamCopyOperation.CopyToAsync(readStream, _response.Body, length, _context.RequestAborted);
}
finally

View File

@ -7,6 +7,7 @@ using Microsoft.AspNet.Builder;
using Microsoft.AspNet.FileSystems;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Framework.Logging;
namespace Microsoft.AspNet.StaticFiles
{
@ -18,13 +19,15 @@ namespace Microsoft.AspNet.StaticFiles
private readonly StaticFileOptions _options;
private readonly PathString _matchUrl;
private readonly RequestDelegate _next;
private readonly ILogger _logger;
/// <summary>
/// Creates a new instance of the StaticFileMiddleware.
/// </summary>
/// <param name="next">The next middleware in the pipeline.</param>
/// <param name="options">The configuration options.</param>
public StaticFileMiddleware([NotNull] RequestDelegate next, [NotNull] IHostingEnvironment hostingEnv, [NotNull] StaticFileOptions options)
/// <param name="loggerFactory">An <see cref="ILoggerFactory"/> instance used to create loggers.</param>
public StaticFileMiddleware([NotNull] RequestDelegate next, [NotNull] IHostingEnvironment hostingEnv, [NotNull] StaticFileOptions options, [NotNull] ILoggerFactory loggerFactory)
{
if (options.ContentTypeProvider == null)
{
@ -35,6 +38,7 @@ namespace Microsoft.AspNet.StaticFiles
_next = next;
_options = options;
_matchUrl = options.RequestPath;
_logger = loggerFactory.Create<StaticFileMiddleware>();
}
/// <summary>
@ -44,7 +48,7 @@ namespace Microsoft.AspNet.StaticFiles
/// <returns></returns>
public Task Invoke(HttpContext context)
{
var fileContext = new StaticFileContext(context, _options, _matchUrl);
var fileContext = new StaticFileContext(context, _options, _matchUrl, _logger);
if (fileContext.ValidateMethod()
&& fileContext.ValidatePath()
&& fileContext.LookupContentType()
@ -64,16 +68,26 @@ namespace Microsoft.AspNet.StaticFiles
{
return fileContext.SendRangeAsync();
}
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("Copying file {0} to the response body", fileContext.SubPath));
}
return fileContext.SendAsync();
case StaticFileContext.PreconditionState.NotModified:
if (_logger.IsEnabled(LogLevel.Verbose))
{
_logger.WriteVerbose(string.Format("{0} not modified", fileContext.SubPath));
}
return fileContext.SendStatusAsync(Constants.Status304NotModified);
case StaticFileContext.PreconditionState.PreconditionFailed:
return fileContext.SendStatusAsync(Constants.Status412PreconditionFailed);
default:
throw new NotImplementedException(fileContext.GetPreconditionState().ToString());
var exception = new NotImplementedException(fileContext.GetPreconditionState().ToString());
_logger.WriteError("No precondition state specified", exception);
throw exception;
}
}

View File

@ -6,7 +6,8 @@
"Microsoft.AspNet.Hosting": { "version": "1.0.0-*", "type": "build" },
"Microsoft.AspNet.Http": "1.0.0-*",
"Microsoft.AspNet.Http.Extensions": "1.0.0-*",
"Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" }
"Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" },
"Microsoft.Framework.Logging": "1.0.0-*"
},
"frameworks": {
"aspnet50": { },