From c1e298b01085f763261374ea4d25e341e33d854c Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 19 Feb 2015 18:09:43 -0800 Subject: [PATCH] React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted --- src/Kestrel/ServerRequest.cs | 5 +++ .../Http/Frame.cs | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/Kestrel/ServerRequest.cs b/src/Kestrel/ServerRequest.cs index 2a7a942ac8..5c3ffc10ff 100644 --- a/src/Kestrel/ServerRequest.cs +++ b/src/Kestrel/ServerRequest.cs @@ -204,6 +204,11 @@ namespace Kestrel _frame.OnSendingHeaders(callback, state); } + void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + { + _frame.OnResponseCompleted(callback, state); + } + bool IHttpUpgradeFeature.IsUpgradableRequest { get diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index c20ae236b1..bf682a7075 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -64,7 +64,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http */ List, object>> _onSendingHeaders; + List, object>> _onResponseCompleted; object _onSendingHeadersSync = new Object(); + object _onResponseCompletedSync = new Object(); public Frame(ConnectionContext context) : base(context) { @@ -200,6 +202,18 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } } + public void OnResponseCompleted(Action callback, object state) + { + lock (_onResponseCompletedSync) + { + if (_onResponseCompleted == null) + { + _onResponseCompleted = new List, object>>(); + } + _onResponseCompleted.Add(new KeyValuePair, object>(callback, state)); + } + } + private void FireOnSendingHeaders() { List, object>> onSendingHeaders = null; @@ -217,6 +231,30 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } } + private void FireOnResponseCompleted() + { + List, object>> onResponseCompleted = null; + lock (_onResponseCompletedSync) + { + onResponseCompleted = _onResponseCompleted; + _onResponseCompleted = null; + } + if (onResponseCompleted != null) + { + foreach (var entry in onResponseCompleted) + { + try + { + entry.Key.Invoke(entry.Value); + } + catch + { + // Ignore exceptions + } + } + } + } + private async Task ExecuteAsync() { Exception error = null; @@ -230,6 +268,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } finally { + FireOnResponseCompleted(); ProduceEnd(error); } }