React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted

This commit is contained in:
Ajay Bhargav Baaskaran 2015-02-19 18:09:43 -08:00
parent 20ffd7e081
commit c1e298b010
2 changed files with 44 additions and 0 deletions

View File

@ -204,6 +204,11 @@ namespace Kestrel
_frame.OnSendingHeaders(callback, state); _frame.OnSendingHeaders(callback, state);
} }
void IHttpResponseFeature.OnResponseCompleted(Action<object> callback, object state)
{
_frame.OnResponseCompleted(callback, state);
}
bool IHttpUpgradeFeature.IsUpgradableRequest bool IHttpUpgradeFeature.IsUpgradableRequest
{ {
get get

View File

@ -64,7 +64,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
*/ */
List<KeyValuePair<Action<object>, object>> _onSendingHeaders; List<KeyValuePair<Action<object>, object>> _onSendingHeaders;
List<KeyValuePair<Action<object>, object>> _onResponseCompleted;
object _onSendingHeadersSync = new Object(); object _onSendingHeadersSync = new Object();
object _onResponseCompletedSync = new Object();
public Frame(ConnectionContext context) : base(context) public Frame(ConnectionContext context) : base(context)
{ {
@ -200,6 +202,18 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
} }
} }
public void OnResponseCompleted(Action<object> callback, object state)
{
lock (_onResponseCompletedSync)
{
if (_onResponseCompleted == null)
{
_onResponseCompleted = new List<KeyValuePair<Action<object>, object>>();
}
_onResponseCompleted.Add(new KeyValuePair<Action<object>, object>(callback, state));
}
}
private void FireOnSendingHeaders() private void FireOnSendingHeaders()
{ {
List<KeyValuePair<Action<object>, object>> onSendingHeaders = null; List<KeyValuePair<Action<object>, object>> onSendingHeaders = null;
@ -217,6 +231,30 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
} }
} }
private void FireOnResponseCompleted()
{
List<KeyValuePair<Action<object>, 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() private async Task ExecuteAsync()
{ {
Exception error = null; Exception error = null;
@ -230,6 +268,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
} }
finally finally
{ {
FireOnResponseCompleted();
ProduceEnd(error); ProduceEnd(error);
} }
} }