Skip to content

Commit 9fa86b3

Browse files
authored
Make trailers safer in TestHost (#32633)
1 parent bc5960e commit 9fa86b3

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/Hosting/TestHost/src/ClientHandler.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,16 @@ protected override async Task<HttpResponseMessage> SendAsync(
184184
// Copy trailers to the response message when the response stream is complete
185185
contextBuilder.RegisterResponseReadCompleteCallback(context =>
186186
{
187-
var responseTrailersFeature = context.Features.Get<IHttpResponseTrailersFeature>()!;
187+
var responseTrailersFeature = context.Features.Get<IHttpResponseTrailersFeature>();
188188

189-
foreach (var trailer in responseTrailersFeature.Trailers)
189+
// Trailers collection is settable so double check the app hasn't set it to null.
190+
if (responseTrailersFeature?.Trailers != null)
190191
{
191-
bool success = response.TrailingHeaders.TryAddWithoutValidation(trailer.Key, (IEnumerable<string>)trailer.Value);
192-
Contract.Assert(success, "Bad trailer");
192+
foreach (var trailer in responseTrailersFeature.Trailers)
193+
{
194+
bool success = response.TrailingHeaders.TryAddWithoutValidation(trailer.Key, (IEnumerable<string>)trailer.Value);
195+
Contract.Assert(success, "Bad trailer");
196+
}
193197
}
194198
});
195199

src/Hosting/TestHost/src/HttpContextBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal HttpContextBuilder(ApplicationWrapper application, bool allowSynchronou
4747
_requestPipe = new Pipe();
4848

4949
var responsePipe = new Pipe();
50-
_responseReaderStream = new ResponseBodyReaderStream(responsePipe, ClientInitiatedAbort, () => _responseReadCompleteCallback?.Invoke(_httpContext));
50+
_responseReaderStream = new ResponseBodyReaderStream(responsePipe, ClientInitiatedAbort, ResponseBodyReadComplete);
5151
_responsePipeWriter = new ResponseBodyPipeWriter(responsePipe, ReturnResponseMessageAsync);
5252
_responseFeature.Body = new ResponseBodyWriterStream(_responsePipeWriter, () => AllowSynchronousIO);
5353
_responseFeature.BodyWriter = _responsePipeWriter;
@@ -180,6 +180,11 @@ internal void ClientInitiatedAbort()
180180
CancelRequestBody();
181181
}
182182

183+
private void ResponseBodyReadComplete()
184+
{
185+
_responseReadCompleteCallback?.Invoke(_httpContext);
186+
}
187+
183188
private bool RequestBodyReadInProgress()
184189
{
185190
try

0 commit comments

Comments
 (0)