1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- using Microsoft.AspNetCore.Http;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Web;
-
- namespace Teknik.Utilities
- {
- public static class ResponseHelper
- {
- public async static Task StreamToOutput(HttpResponse response, bool flush, Stream stream, int length, int chunkSize)
- {
- try
- {
- int processedBytes = 0;
- byte[] buffer = new byte[chunkSize];
- int bytesRemaining = length;
- int bytesToRead = chunkSize;
- do
- {
- if (chunkSize > bytesRemaining)
- {
- bytesToRead = bytesRemaining;
- }
-
- processedBytes = stream.Read(buffer, 0, bytesToRead);
- if (processedBytes > 0)
- {
- await response.Body.WriteAsync(buffer, 0, processedBytes);
-
- // Flush the response
- if (flush)
- {
- await response.Body.FlushAsync();
- }
-
- // Clear the buffer
- Array.Clear(buffer, 0, chunkSize);
-
- // decrement the total bytes remaining to process
- bytesRemaining -= processedBytes;
- }
- }
- while (processedBytes > 0 && bytesRemaining > 0);
- }
- catch (Exception)
- {
- // Don't worry about it. Just leave
- await response.Body.FlushAsync();
- }
- finally
- {
- await response.Body.FlushAsync();
- // dispose of file stream
- stream?.Dispose();
- }
- }
- }
- }
|