public async Task Write_calls_should_produce_correct_output(int inputLength, int maxWriteSize) { GenerateData(inputLength); var output1 = new MemoryStream(); var output2 = new MemoryStream(); var output3 = new MemoryStream(); var wrapper1 = new ResponseStreamWrapper(output1, maxWriteSize); var wrapper2 = new ResponseStreamWrapper(output2, maxWriteSize); var wrapper3 = new ResponseStreamWrapper(output3, maxWriteSize); wrapper1.Write(merged, leadingGarbage.Length, payload.Length); await wrapper2.WriteAsync(merged, leadingGarbage.Length, payload.Length, CancellationToken.None); #if NETCOREAPP3_1 await wrapper3.WriteAsync(new ReadOnlyMemory <byte>(merged, leadingGarbage.Length, payload.Length)); #endif output1.ToArray().Should().Equal(payload); output2.ToArray().Should().Equal(payload); #if NETCOREAPP3_1 output3.ToArray().Should().Equal(payload); #endif }
/// <summary> /// Inspects the responses for all requests for HTML documents /// and injects the JavaScript to configure JSNLog client side. /// /// Uses a wrapper stream to wrap the response and examine /// only text/html requests - other content is passed through /// as is. /// </summary> /// <param name="context"></param> /// <returns></returns> private async Task HandleHtmlInjection(HttpContext context) { var path = context.Request.Path.Value; // Use a custom StreamWrapper to rewrite output on Write/WriteAsync using (var filteredResponse = new ResponseStreamWrapper(context.Response.Body, context)) { #if !NETCORE2 // Use new IHttpResponseBodyFeature for abstractions of pilelines/streams etc. // For 3.x this works reliably while direct Response.Body was causing random HTTP failures context.Features.Set <IHttpResponseBodyFeature>(new StreamResponseBodyFeature(filteredResponse)); #else context.Response.Body = filteredResponse; #endif await _next(context); } }