Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
    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));
    }
Esempio n. 4
0
    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);
    }