aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-09-04 15:28:22 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-09-04 15:28:22 -0400
commit39c4542cf691134cfa7f9d5cafbd7dd1083d5ec9 (patch)
tree29d631f2313c7af9213cde30c708cd6b8bc9106a /SocketHttpListener
parentc4176d232044e8356a8d6389912efa05008d0dc2 (diff)
update query objects
Diffstat (limited to 'SocketHttpListener')
-rw-r--r--SocketHttpListener/Net/HttpResponseStream.Managed.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/SocketHttpListener/Net/HttpResponseStream.Managed.cs b/SocketHttpListener/Net/HttpResponseStream.Managed.cs
index d5ef0b320..7e175f8d6 100644
--- a/SocketHttpListener/Net/HttpResponseStream.Managed.cs
+++ b/SocketHttpListener/Net/HttpResponseStream.Managed.cs
@@ -289,9 +289,65 @@ namespace SocketHttpListener.Net
public Task TransmitFile(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
{
+ //if (_supportsDirectSocketAccess && offset == 0 && count == 0 && !_response.SendChunked && _response.ContentLength64 > 8192)
+ //{
+ // if (EnableSendFileWithSocket)
+ // {
+ // return TransmitFileOverSocket(path, offset, count, fileShareMode, cancellationToken);
+ // }
+ //}
+
return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
}
+ private readonly byte[] _emptyBuffer = new byte[] { };
+ private Task TransmitFileOverSocket(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
+ {
+ var ms = GetHeaders(false);
+
+ byte[] preBuffer;
+ if (ms != null)
+ {
+ using (var msCopy = new MemoryStream())
+ {
+ ms.CopyTo(msCopy);
+ preBuffer = msCopy.ToArray();
+ }
+ }
+ else
+ {
+ return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
+ }
+
+ //_logger.Info("Socket sending file {0} {1}", path, response.ContentLength64);
+
+ var taskCompletion = new TaskCompletionSource<bool>();
+
+ Action<IAsyncResult> callback = callbackResult =>
+ {
+ try
+ {
+ _socket.EndSendFile(callbackResult);
+ taskCompletion.TrySetResult(true);
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
+ };
+
+ var result = _socket.BeginSendFile(path, preBuffer, _emptyBuffer, TransmitFileOptions.UseDefaultWorkerThread, new AsyncCallback(callback), null);
+
+ if (result.CompletedSynchronously)
+ {
+ callback(result);
+ }
+
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
+
+ return taskCompletion.Task;
+ }
+
const int StreamCopyToBufferSize = 81920;
private async Task TransmitFileManaged(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
{