Skip to content
This repository was archived by the owner on Mar 19, 2019. It is now read-only.

Commit 39b8d20

Browse files
committed
React to aspnet/HttpAbstractions#160 - Implemented OnResponseCompleted
1 parent b761e7d commit 39b8d20

File tree

4 files changed

+54
-0
lines changed

4 files changed

+54
-0
lines changed

src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,11 @@ void IHttpResponseFeature.OnSendingHeaders(Action<object> callback, object state
360360
Response.OnSendingHeaders(callback, state);
361361
}
362362

363+
void IHttpResponseFeature.OnResponseCompleted(Action<object> callback, object state)
364+
{
365+
Response.OnResponseCompleted(callback, state);
366+
}
367+
363368
string IHttpResponseFeature.ReasonPhrase
364369
{
365370
get { return Response.ReasonPhrase; }

src/Microsoft.Net.Http.Server/RequestProcessing/Response.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public sealed unsafe class Response
4848
private BoundaryType _boundaryType;
4949
private UnsafeNclNativeMethods.HttpApi.HTTP_RESPONSE_V2 _nativeResponse;
5050
private IList<Tuple<Action<object>, object>> _onSendingHeadersActions;
51+
private IList<Tuple<Action<object>, object>> _onResponseCompletedActions;
5152

5253
private RequestContext _requestContext;
5354

@@ -63,6 +64,7 @@ internal Response(RequestContext httpContext)
6364
_nativeResponse.Response_V1.Version.MinorVersion = 1;
6465
_responseState = ResponseState.Created;
6566
_onSendingHeadersActions = new List<Tuple<Action<object>, object>>();
67+
_onResponseCompletedActions = new List<Tuple<Action<object>, object>>();
6668
}
6769

6870
private enum ResponseState
@@ -284,6 +286,7 @@ internal void Dispose()
284286
{
285287
return;
286288
}
289+
NotifyOnResponseCompleted();
287290
// TODO: Verbose log
288291
EnsureResponseStream();
289292
_nativeStream.Dispose();
@@ -829,6 +832,17 @@ public void OnSendingHeaders(Action<object> callback, object state)
829832
actions.Add(new Tuple<Action<object>, object>(callback, state));
830833
}
831834

835+
public void OnResponseCompleted(Action<object> callback, object state)
836+
{
837+
var actions = _onResponseCompletedActions;
838+
if (actions == null)
839+
{
840+
throw new InvalidOperationException("Response already completed");
841+
}
842+
843+
actions.Add(new Tuple<Action<object>, object>(callback, state));
844+
}
845+
832846
private void NotifyOnSendingHeaders()
833847
{
834848
var actions = Interlocked.Exchange(ref _onSendingHeadersActions, null);
@@ -845,6 +859,30 @@ private void NotifyOnSendingHeaders()
845859
}
846860
}
847861

862+
private void NotifyOnResponseCompleted()
863+
{
864+
var actions = Interlocked.Exchange(ref _onResponseCompletedActions, null);
865+
if (actions == null)
866+
{
867+
// Something threw the first time, do not try again.
868+
return;
869+
}
870+
871+
foreach (var actionPair in actions)
872+
{
873+
try
874+
{
875+
actionPair.Item1(actionPair.Item2);
876+
}
877+
catch (Exception ex)
878+
{
879+
RequestContext.Logger.LogWarning(
880+
String.Format(Resources.Warning_ExceptionInOnResponseCompletedAction, nameof(OnResponseCompleted)),
881+
ex);
882+
}
883+
}
884+
}
885+
848886
private class SendResponseLogContext : ReflectionBasedLogValues
849887
{
850888
private readonly Response _response;

src/Microsoft.Net.Http.Server/Resources.Designer.cs

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.Net.Http.Server/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,7 @@
147147
<data name="Exception_WrongIAsyncResult" xml:space="preserve">
148148
<value>The given IAsyncResult does not match this opperation.</value>
149149
</data>
150+
<data name="Warning_ExceptionInOnResponseCompletedAction" xml:space="preserve">
151+
<value>An exception occured while running an action registered with {0}.</value>
152+
</data>
150153
</root>

0 commit comments

Comments
 (0)