mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-22 18:14:42 +01:00
a few more async optimizations
This commit is contained in:
parent
1c5f728ec2
commit
fbf8cc833c
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Common.Net.Handlers
|
||||
@@ -16,37 +15,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
|
||||
public override Task<string> GetContentType()
|
||||
{
|
||||
return Task.Run(() =>
|
||||
{
|
||||
string extension = Path.GetExtension(ResourcePath);
|
||||
|
||||
if (extension.EndsWith("jpeg", StringComparison.OrdinalIgnoreCase) || extension.EndsWith("jpg", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "image/jpeg";
|
||||
}
|
||||
else if (extension.EndsWith("png", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "image/png";
|
||||
}
|
||||
else if (extension.EndsWith("ico", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "image/ico";
|
||||
}
|
||||
else if (extension.EndsWith("js", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "application/x-javascript";
|
||||
}
|
||||
else if (extension.EndsWith("css", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "text/css";
|
||||
}
|
||||
else if (extension.EndsWith("html", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "text/html; charset=utf-8";
|
||||
}
|
||||
|
||||
return "text/plain; charset=utf-8";
|
||||
});
|
||||
return Task.FromResult<string>(MimeTypes.GetMimeType(ResourcePath));
|
||||
}
|
||||
|
||||
protected override Task WriteResponseToOutputStream(Stream stream)
|
||||
|
||||
@@ -185,11 +185,11 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
// When serving a range request, we need to return status code 206 to indicate a partial response body
|
||||
StatusCode = SupportsByteRangeRequests && IsRangeRequest ? 206 : 200;
|
||||
|
||||
ctx.Response.ContentType = await GetContentType();
|
||||
ctx.Response.ContentType = await GetContentType().ConfigureAwait(false);
|
||||
|
||||
TimeSpan cacheDuration = CacheDuration;
|
||||
|
||||
DateTime? lastDateModified = await GetLastDateModified();
|
||||
DateTime? lastDateModified = await GetLastDateModified().ConfigureAwait(false);
|
||||
|
||||
if (ctx.Request.Headers.AllKeys.Contains("If-Modified-Since"))
|
||||
{
|
||||
@@ -205,13 +205,13 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
}
|
||||
}
|
||||
|
||||
await PrepareResponse();
|
||||
await PrepareResponse().ConfigureAwait(false);
|
||||
|
||||
if (IsResponseValid)
|
||||
{
|
||||
bool compressResponse = ShouldCompressResponse(ctx.Response.ContentType) && ClientSupportsCompression;
|
||||
|
||||
await ProcessUncachedRequest(ctx, compressResponse, cacheDuration, lastDateModified);
|
||||
await ProcessUncachedRequest(ctx, compressResponse, cacheDuration, lastDateModified).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -285,7 +285,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
outputStream = CompressedStream;
|
||||
}
|
||||
|
||||
await WriteResponseToOutputStream(outputStream);
|
||||
await WriteResponseToOutputStream(outputStream).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -307,7 +307,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
/// </summary>
|
||||
protected virtual Task PrepareResponse()
|
||||
{
|
||||
return Task.Run(() => { });
|
||||
return Task.FromResult<object>(null);
|
||||
}
|
||||
|
||||
protected abstract Task WriteResponseToOutputStream(Stream stream);
|
||||
@@ -359,7 +359,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
{
|
||||
DateTime? value = null;
|
||||
|
||||
return Task.Run<DateTime?>(() => { return value; });
|
||||
return Task.FromResult<DateTime?>(value);
|
||||
}
|
||||
|
||||
private bool IsResponseValid
|
||||
|
||||
@@ -8,10 +8,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
{
|
||||
public override Task<string> GetContentType()
|
||||
{
|
||||
return Task.Run(() =>
|
||||
{
|
||||
return MimeTypes.JsonMimeType;
|
||||
});
|
||||
return Task.FromResult<string>(MimeTypes.JsonMimeType);
|
||||
}
|
||||
|
||||
private bool _ObjectToSerializeEnsured = false;
|
||||
@@ -21,7 +18,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
{
|
||||
if (!_ObjectToSerializeEnsured)
|
||||
{
|
||||
_ObjectToSerialize = await GetObjectToSerialize();
|
||||
_ObjectToSerialize = await GetObjectToSerialize().ConfigureAwait(false);
|
||||
|
||||
if (_ObjectToSerialize == null)
|
||||
{
|
||||
@@ -34,9 +31,9 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
|
||||
protected abstract Task<T> GetObjectToSerialize();
|
||||
|
||||
protected override async Task PrepareResponse()
|
||||
protected override Task PrepareResponse()
|
||||
{
|
||||
await EnsureObjectToSerialize();
|
||||
return EnsureObjectToSerialize();
|
||||
}
|
||||
|
||||
protected async override Task WriteResponseToOutputStream(Stream stream)
|
||||
|
||||
@@ -102,33 +102,30 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
|
||||
protected override Task<DateTime?> GetLastDateModified()
|
||||
{
|
||||
return Task.Run<DateTime?>(() =>
|
||||
DateTime? value = null;
|
||||
|
||||
EnsureSourceStream();
|
||||
|
||||
if (SourceStream != null)
|
||||
{
|
||||
EnsureSourceStream();
|
||||
value = File.GetLastWriteTime(Path);
|
||||
}
|
||||
|
||||
if (SourceStream == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return File.GetLastWriteTime(Path);
|
||||
});
|
||||
return Task.FromResult<DateTime?>(value);
|
||||
}
|
||||
|
||||
public override Task<string> GetContentType()
|
||||
{
|
||||
return Task.Run(() =>
|
||||
{
|
||||
return MimeTypes.GetMimeType(Path);
|
||||
});
|
||||
return Task.FromResult<string>(MimeTypes.GetMimeType(Path));
|
||||
}
|
||||
|
||||
protected override Task PrepareResponse()
|
||||
{
|
||||
return Task.Run(() => { EnsureSourceStream(); });
|
||||
EnsureSourceStream();
|
||||
return Task.FromResult<object>(null);
|
||||
}
|
||||
|
||||
protected async override Task WriteResponseToOutputStream(Stream stream)
|
||||
protected override Task WriteResponseToOutputStream(Stream stream)
|
||||
{
|
||||
if (IsRangeRequest)
|
||||
{
|
||||
@@ -137,22 +134,22 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
// If the requested range is "0-" and we know the total length, we can optimize by avoiding having to buffer the content into memory
|
||||
if (requestedRange.Value == null && TotalContentLength != null)
|
||||
{
|
||||
await ServeCompleteRangeRequest(requestedRange, stream);
|
||||
return ServeCompleteRangeRequest(requestedRange, stream);
|
||||
}
|
||||
else if (TotalContentLength.HasValue)
|
||||
{
|
||||
// This will have to buffer a portion of the content into memory
|
||||
await ServePartialRangeRequestWithKnownTotalContentLength(requestedRange, stream);
|
||||
return ServePartialRangeRequestWithKnownTotalContentLength(requestedRange, stream);
|
||||
}
|
||||
else
|
||||
{
|
||||
// This will have to buffer the entire content into memory
|
||||
await ServePartialRangeRequestWithUnknownTotalContentLength(requestedRange, stream);
|
||||
return ServePartialRangeRequestWithUnknownTotalContentLength(requestedRange, stream);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
await SourceStream.CopyToAsync(stream);
|
||||
return SourceStream.CopyToAsync(stream);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,7 +167,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
/// Handles a range request of "bytes=0-"
|
||||
/// This will serve the complete content and add the content-range header
|
||||
/// </summary>
|
||||
private async Task ServeCompleteRangeRequest(KeyValuePair<long, long?> requestedRange, Stream responseStream)
|
||||
private Task ServeCompleteRangeRequest(KeyValuePair<long, long?> requestedRange, Stream responseStream)
|
||||
{
|
||||
long totalContentLength = TotalContentLength.Value;
|
||||
|
||||
@@ -187,7 +184,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
SourceStream.Position = rangeStart;
|
||||
}
|
||||
|
||||
await SourceStream.CopyToAsync(responseStream);
|
||||
return SourceStream.CopyToAsync(responseStream);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -196,7 +193,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
private async Task ServePartialRangeRequestWithUnknownTotalContentLength(KeyValuePair<long, long?> requestedRange, Stream responseStream)
|
||||
{
|
||||
// Read the entire stream so that we can determine the length
|
||||
byte[] bytes = await ReadBytes(SourceStream, 0, null);
|
||||
byte[] bytes = await ReadBytes(SourceStream, 0, null).ConfigureAwait(false);
|
||||
|
||||
long totalContentLength = bytes.LongLength;
|
||||
|
||||
@@ -208,7 +205,7 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
HttpListenerContext.Response.ContentLength64 = rangeLength;
|
||||
HttpListenerContext.Response.Headers["Content-Range"] = string.Format("bytes {0}-{1}/{2}", rangeStart, rangeEnd, totalContentLength);
|
||||
|
||||
await responseStream.WriteAsync(bytes, Convert.ToInt32(rangeStart), Convert.ToInt32(rangeLength));
|
||||
await responseStream.WriteAsync(bytes, Convert.ToInt32(rangeStart), Convert.ToInt32(rangeLength)).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -222,14 +219,14 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
long rangeLength = 1 + rangeEnd - rangeStart;
|
||||
|
||||
// Only read the bytes we need
|
||||
byte[] bytes = await ReadBytes(SourceStream, Convert.ToInt32(rangeStart), Convert.ToInt32(rangeLength));
|
||||
byte[] bytes = await ReadBytes(SourceStream, Convert.ToInt32(rangeStart), Convert.ToInt32(rangeLength)).ConfigureAwait(false);
|
||||
|
||||
// Content-Length is the length of what we're serving, not the original content
|
||||
HttpListenerContext.Response.ContentLength64 = rangeLength;
|
||||
|
||||
HttpListenerContext.Response.Headers["Content-Range"] = string.Format("bytes {0}-{1}/{2}", rangeStart, rangeEnd, totalContentLength);
|
||||
|
||||
await responseStream.WriteAsync(bytes, 0, Convert.ToInt32(rangeLength));
|
||||
await responseStream.WriteAsync(bytes, 0, Convert.ToInt32(rangeLength)).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -252,9 +249,9 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
int read;
|
||||
while ((read = await input.ReadAsync(buffer, 0, buffer.Length)) > 0)
|
||||
while ((read = await input.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false)) > 0)
|
||||
{
|
||||
await ms.WriteAsync(buffer, 0, read);
|
||||
await ms.WriteAsync(buffer, 0, read).ConfigureAwait(false);
|
||||
}
|
||||
return ms.ToArray();
|
||||
}
|
||||
@@ -265,9 +262,9 @@ namespace MediaBrowser.Common.Net.Handlers
|
||||
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
int read = await input.ReadAsync(buffer, 0, buffer.Length);
|
||||
int read = await input.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
||||
|
||||
await ms.WriteAsync(buffer, 0, read);
|
||||
await ms.WriteAsync(buffer, 0, read).ConfigureAwait(false);
|
||||
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user