React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted
This commit is contained in:
parent
20ffd7e081
commit
c1e298b010
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue