Skip to content

Commit 05369b7

Browse files
committed
Pass HttpContext.RequestAborted to WebDAV response execution
Fixes #47, this time for real!
1 parent e6faf9e commit 05369b7

File tree

2 files changed

+38
-35
lines changed

2 files changed

+38
-35
lines changed

src/FubarDev.WebDavServer.AspNetCore/WebDavIndirectResult.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// <copyright file="WebDavIndirectResult.cs" company="Fubar Development Junker">
1+
// <copyright file="WebDavIndirectResult.cs" company="Fubar Development Junker">
22
// Copyright (c) Fubar Development Junker. All rights reserved.
33
// </copyright>
44

@@ -65,7 +65,7 @@ public override async Task ExecuteResultAsync(ActionContext context)
6565
if (_logger?.IsEnabled(LogLevel.Debug) ?? false)
6666
{
6767
var loggingResponse = new LoggingWebDavResponse(_dispatcher);
68-
await _result.ExecuteResultAsync(loggingResponse, CancellationToken.None).ConfigureAwait(false);
68+
await _result.ExecuteResultAsync(loggingResponse, context.HttpContext.RequestAborted).ConfigureAwait(false);
6969
if (!string.IsNullOrEmpty(loggingResponse.ContentType))
7070
{
7171
var mediaType = new MediaType(loggingResponse.ContentType);
@@ -79,7 +79,7 @@ public override async Task ExecuteResultAsync(ActionContext context)
7979
}
8080

8181
// Writes the XML response
82-
await _result.ExecuteResultAsync(new WebDavResponse(_dispatcher, response), CancellationToken.None).ConfigureAwait(false);
82+
await _result.ExecuteResultAsync(new WebDavResponse(_dispatcher, response), context.HttpContext.RequestAborted).ConfigureAwait(false);
8383
}
8484
}
8585
}

src/FubarDev.WebDavServer/Handlers/Impl/GetResults/WebDavPartialDocumentResult.cs

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -91,63 +91,66 @@ public override async Task ExecuteResultAsync(IWebDavResponse response, Cancella
9191
contentType = MimeTypesMap.DefaultMimeType;
9292
}
9393

94-
HttpContent content;
9594
if (_rangeItems.Count == 1)
9695
{
9796
// No multipart content
9897
var rangeItem = _rangeItems.Single();
9998
var streamView = views.Single();
100-
content = new StreamContent(streamView);
101-
try
99+
using (var streamContent = new StreamContent(streamView))
102100
{
103-
content.Headers.ContentRange = new ContentRangeHeaderValue(rangeItem.From, rangeItem.To, _document.Length);
104-
content.Headers.ContentLength = rangeItem.Length;
105-
}
106-
catch
107-
{
108-
content.Dispose();
109-
throw;
110-
}
101+
streamContent.Headers.ContentRange = new ContentRangeHeaderValue(
102+
rangeItem.From,
103+
rangeItem.To,
104+
_document.Length);
105+
streamContent.Headers.ContentLength = rangeItem.Length;
106+
107+
streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
108+
109+
await SetPropertiesToContentHeaderAsync(streamContent, properties, ct)
110+
.ConfigureAwait(false);
111111

112-
content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
112+
foreach (var header in streamContent.Headers)
113+
{
114+
response.Headers.Add(header.Key, header.Value.ToArray());
115+
}
116+
117+
// Use the CopyToAsync function of the stream itself, because
118+
// we're able to pass the cancellation token. This is a workaround
119+
// for issue dotnet/corefx#9071 and fixes FubarDevelopment/WebDavServer#47.
120+
await streamView.CopyToAsync(response.Body, 81920, ct)
121+
.ConfigureAwait(false);
122+
}
113123
}
114124
else
115125
{
116126
// Multipart content
117-
var multipart = new MultipartContent("byteranges");
118-
try
127+
using (var multipart = new MultipartContent("byteranges"))
119128
{
120129
var index = 0;
121130
foreach (var rangeItem in _rangeItems)
122131
{
123132
var streamView = views[index++];
124133
var partContent = new StreamContent(streamView);
125-
partContent.Headers.ContentRange = new ContentRangeHeaderValue(rangeItem.From, rangeItem.To, _document.Length);
134+
partContent.Headers.ContentRange = new ContentRangeHeaderValue(
135+
rangeItem.From,
136+
rangeItem.To,
137+
_document.Length);
126138
partContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
127139
partContent.Headers.ContentLength = rangeItem.Length;
128140
multipart.Add(partContent);
129141
}
130-
}
131-
catch
132-
{
133-
multipart.Dispose();
134-
throw;
135-
}
136142

137-
content = multipart;
138-
}
143+
await SetPropertiesToContentHeaderAsync(multipart, properties, ct)
144+
.ConfigureAwait(false);
139145

140-
using (content)
141-
{
142-
await SetPropertiesToContentHeaderAsync(content, properties, ct)
143-
.ConfigureAwait(false);
146+
foreach (var header in multipart.Headers)
147+
{
148+
response.Headers.Add(header.Key, header.Value.ToArray());
149+
}
144150

145-
foreach (var header in content.Headers)
146-
{
147-
response.Headers.Add(header.Key, header.Value.ToArray());
151+
// TODO: Workaround for issue dotnet/corefx#9071
152+
await multipart.CopyToAsync(response.Body).ConfigureAwait(false);
148153
}
149-
150-
await content.CopyToAsync(response.Body).ConfigureAwait(false);
151154
}
152155
}
153156
finally

0 commit comments

Comments
 (0)