Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Commit c1e298b

Browse files
committed
React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted
1 parent 20ffd7e commit c1e298b

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/Kestrel/ServerRequest.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,11 @@ void IHttpResponseFeature.OnSendingHeaders(Action<object> callback, object state
204204
_frame.OnSendingHeaders(callback, state);
205205
}
206206

207+
void IHttpResponseFeature.OnResponseCompleted(Action<object> callback, object state)
208+
{
209+
_frame.OnResponseCompleted(callback, state);
210+
}
211+
207212
bool IHttpUpgradeFeature.IsUpgradableRequest
208213
{
209214
get

src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ enum Mode
6464
*/
6565

6666
List<KeyValuePair<Action<object>, object>> _onSendingHeaders;
67+
List<KeyValuePair<Action<object>, object>> _onResponseCompleted;
6768
object _onSendingHeadersSync = new Object();
69+
object _onResponseCompletedSync = new Object();
6870

6971
public Frame(ConnectionContext context) : base(context)
7072
{
@@ -200,6 +202,18 @@ public void OnSendingHeaders(Action<object> callback, object state)
200202
}
201203
}
202204

205+
public void OnResponseCompleted(Action<object> callback, object state)
206+
{
207+
lock (_onResponseCompletedSync)
208+
{
209+
if (_onResponseCompleted == null)
210+
{
211+
_onResponseCompleted = new List<KeyValuePair<Action<object>, object>>();
212+
}
213+
_onResponseCompleted.Add(new KeyValuePair<Action<object>, object>(callback, state));
214+
}
215+
}
216+
203217
private void FireOnSendingHeaders()
204218
{
205219
List<KeyValuePair<Action<object>, object>> onSendingHeaders = null;
@@ -217,6 +231,30 @@ private void FireOnSendingHeaders()
217231
}
218232
}
219233

234+
private void FireOnResponseCompleted()
235+
{
236+
List<KeyValuePair<Action<object>, object>> onResponseCompleted = null;
237+
lock (_onResponseCompletedSync)
238+
{
239+
onResponseCompleted = _onResponseCompleted;
240+
_onResponseCompleted = null;
241+
}
242+
if (onResponseCompleted != null)
243+
{
244+
foreach (var entry in onResponseCompleted)
245+
{
246+
try
247+
{
248+
entry.Key.Invoke(entry.Value);
249+
}
250+
catch
251+
{
252+
// Ignore exceptions
253+
}
254+
}
255+
}
256+
}
257+
220258
private async Task ExecuteAsync()
221259
{
222260
Exception error = null;
@@ -230,6 +268,7 @@ private async Task ExecuteAsync()
230268
}
231269
finally
232270
{
271+
FireOnResponseCompleted();
233272
ProduceEnd(error);
234273
}
235274
}

0 commit comments

Comments
 (0)