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);
}
void IHttpResponseFeature.OnResponseCompleted(Action<object> callback, object state)
{
_frame.OnResponseCompleted(callback, state);
}
bool IHttpUpgradeFeature.IsUpgradableRequest
{
get

View File

@ -64,7 +64,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
*/
List<KeyValuePair<Action<object>, object>> _onSendingHeaders;
List<KeyValuePair<Action<object>, 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<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()
{
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()
{
Exception error = null;
@ -230,6 +268,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
}
finally
{
FireOnResponseCompleted();
ProduceEnd(error);
}
}