diff --git a/src/FubarDev.WebDavServer.AspNetCore/LoggingWebDavResponse.cs b/src/FubarDev.WebDavServer.AspNetCore/LoggingWebDavResponse.cs index f1c660a9..7920c342 100644 --- a/src/FubarDev.WebDavServer.AspNetCore/LoggingWebDavResponse.cs +++ b/src/FubarDev.WebDavServer.AspNetCore/LoggingWebDavResponse.cs @@ -4,38 +4,39 @@ using System.Collections.Generic; using System.IO; +using System.Threading; +using System.Threading.Tasks; using System.Xml.Linq; using FubarDev.WebDavServer.AspNetCore.Logging; +using FubarDev.WebDavServer.Utils; + +using Microsoft.AspNetCore.Http; namespace FubarDev.WebDavServer.AspNetCore { /// - /// A implementation that buffers the output of a . + /// A implementation that buffers the output of a . /// - public class LoggingWebDavResponse : IWebDavResponse + public class LoggingWebDavResponse : WebDavResponse { + private readonly HttpResponse _response; + /// /// Initializes a new instance of the class. /// /// The current WebDAV context. - public LoggingWebDavResponse(IWebDavContext context) + /// The ASP.NET Core HTTP response. + public LoggingWebDavResponse(IWebDavContext context, HttpResponse response) + : base(context, response) { - Context = context; - ContentType = "text/xml"; + _response = response; } - /// - public IWebDavContext Context { get; } - - /// - public IDictionary Headers { get; } = new Dictionary(); - - /// - public string ContentType { get; set; } - - /// - public Stream Body { get; } = new MemoryStream(); + /// + /// Gets the buffered output stream + /// + public override Stream Body { get; } = new MemoryStream(); /// /// Loads the into a . @@ -63,5 +64,16 @@ public LoggingWebDavResponse(IWebDavContext context) return null; } } + + /// + /// Writes the buffered output to the http response body + /// + /// The for the http request + /// A representing the asynchronous operation. + public async Task WriteBufferedOutPutToResponse(CancellationToken cancellationToken) + { + Body.Position = 0; + await Body.CopyToAsync(_response.Body, SystemInfo.CopyBufferSize, cancellationToken); + } } } diff --git a/src/FubarDev.WebDavServer.AspNetCore/WebDavIndirectResult.cs b/src/FubarDev.WebDavServer.AspNetCore/WebDavIndirectResult.cs index 9c2aadac..d4383aa6 100644 --- a/src/FubarDev.WebDavServer.AspNetCore/WebDavIndirectResult.cs +++ b/src/FubarDev.WebDavServer.AspNetCore/WebDavIndirectResult.cs @@ -65,7 +65,7 @@ public override async Task ExecuteResultAsync(ActionContext context) if (_logger?.IsEnabled(LogLevel.Debug) ?? false) { - var loggingResponse = new LoggingWebDavResponse(_context); + var loggingResponse = new LoggingWebDavResponse(_context, response); await _result.ExecuteResultAsync(loggingResponse, context.HttpContext.RequestAborted).ConfigureAwait(false); if (!string.IsNullOrEmpty(loggingResponse.ContentType)) { @@ -81,6 +81,9 @@ public override async Task ExecuteResultAsync(ActionContext context) } } } + + await loggingResponse.WriteBufferedOutPutToResponse(context.HttpContext.RequestAborted).ConfigureAwait(false); + return; } // Writes the XML response diff --git a/src/FubarDev.WebDavServer.AspNetCore/WebDavResponse.cs b/src/FubarDev.WebDavServer.AspNetCore/WebDavResponse.cs index 759bcb06..323b39f0 100644 --- a/src/FubarDev.WebDavServer.AspNetCore/WebDavResponse.cs +++ b/src/FubarDev.WebDavServer.AspNetCore/WebDavResponse.cs @@ -48,7 +48,7 @@ public string ContentType } /// - public Stream Body => _response.Body; + public virtual Stream Body => _response.Body; private class HeadersDictionary : IDictionary {