diff options
Diffstat (limited to 'Emby.Server.Implementations/SocketSharp/WebSocketSharpResponse.cs')
| -rw-r--r-- | Emby.Server.Implementations/SocketSharp/WebSocketSharpResponse.cs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/SocketSharp/WebSocketSharpResponse.cs b/Emby.Server.Implementations/SocketSharp/WebSocketSharpResponse.cs new file mode 100644 index 000000000..0f67eaa62 --- /dev/null +++ b/Emby.Server.Implementations/SocketSharp/WebSocketSharpResponse.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Services; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using IRequest = MediaBrowser.Model.Services.IRequest; + +namespace Emby.Server.Implementations.SocketSharp +{ + public class WebSocketSharpResponse : IResponse + { + private readonly ILogger _logger; + + public WebSocketSharpResponse(ILogger logger, HttpResponse response) + { + _logger = logger; + OriginalResponse = response; + } + + public HttpResponse OriginalResponse { get; } + + public int StatusCode + { + get => OriginalResponse.StatusCode; + set => OriginalResponse.StatusCode = value; + } + + public string StatusDescription { get; set; } + + public string ContentType + { + get => OriginalResponse.ContentType; + set => OriginalResponse.ContentType = value; + } + + public void AddHeader(string name, string value) + { + if (string.Equals(name, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + ContentType = value; + return; + } + + OriginalResponse.Headers.Add(name, value); + } + + public void Redirect(string url) + { + OriginalResponse.Redirect(url); + } + + public Stream OutputStream => OriginalResponse.Body; + + public bool SendChunked { get; set; } + + const int StreamCopyToBufferSize = 81920; + public async Task TransmitFile(string path, long offset, long count, FileShareMode fileShareMode, IFileSystem fileSystem, IStreamHelper streamHelper, CancellationToken cancellationToken) + { + var allowAsync = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + + //if (count <= 0) + //{ + // allowAsync = true; + //} + + var fileOpenOptions = FileOpenOptions.SequentialScan; + + if (allowAsync) + { + fileOpenOptions |= FileOpenOptions.Asynchronous; + } + + // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 + + using (var fs = fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShareMode, fileOpenOptions)) + { + if (offset > 0) + { + fs.Position = offset; + } + + if (count > 0) + { + await streamHelper.CopyToAsync(fs, OutputStream, count, cancellationToken).ConfigureAwait(false); + } + else + { + await fs.CopyToAsync(OutputStream, StreamCopyToBufferSize, cancellationToken).ConfigureAwait(false); + } + } + } + } +} |
