private static async Task <bool> ServeBody(HttpResponse response, Components.IFileInfo fileInfo, CancellationToken cancellationToken) { if (response == null) { throw new ArgumentNullException(nameof(response)); } if (fileInfo == null) { throw new ArgumentNullException(nameof(fileInfo)); } var stream = response.Body; if (!await fileInfo.CopyTo(stream, cancellationToken)) { if (stream.CanSeek) { response.Clear(); } return(false); } return(true); }
private async Task <bool> ServeFile(HttpResponse response, Components.IFileInfo fileInfo, bool serveContent, CancellationToken cancellationToken) { ServeHeaders(response, fileInfo?.Filename); if (!serveContent) { return(true); } return(await ServeBody(response, fileInfo, cancellationToken)); }
private async Task <bool> ServeFile(HttpResponse response, Components.IFileInfo fileInfo, bool serveContent, CancellationToken cancellationToken) { var options = _optionsSource.CurrentValue; ServeHeaders(response, fileInfo.Filename, options); if (!serveContent) { response.Headers.ContentLength = fileInfo.Length; return(true); } return(await ServeBody(response, fileInfo, options, cancellationToken)); }
private async Task <bool> ServeBody(HttpResponse response, Components.IFileInfo fileInfo, Components.HttpServerOptions options, CancellationToken cancellationToken) { var length = fileInfo.Length; if (length > options.MaxBufferedLength) { return(await fileInfo.CopyTo(response.Body, cancellationToken)); } await using var buffer = (RecyclableMemoryStream)_streamManager.GetStream(); if (!await fileInfo.CopyTo(buffer, cancellationToken)) { return(false); } response.ContentLength = length; foreach (var segment in buffer.GetReadOnlySequence()) { await response.BodyWriter.WriteAsync(segment, cancellationToken); } return(true); }