public async Task UpgradeToWebSocketLogsWrittenOnlyOnce(HttpLoggingFields loggingFields) { var options = CreateOptionsAccessor(); options.CurrentValue.LoggingFields = loggingFields; var httpContext = new DefaultHttpContext(); var upgradeFeatureMock = new Mock <IHttpUpgradeFeature>(); upgradeFeatureMock.Setup(m => m.IsUpgradableRequest).Returns(true); upgradeFeatureMock .Setup(m => m.UpgradeAsync()) .Callback(() => { httpContext.Response.StatusCode = StatusCodes.Status101SwitchingProtocols; httpContext.Response.Headers[HeaderNames.Connection] = HeaderNames.Upgrade; }) .ReturnsAsync(Stream.Null); httpContext.Features.Set <IHttpUpgradeFeature>(upgradeFeatureMock.Object); var writeCount = 0; TestSink.MessageLogged += (context) => { writeCount++; }; var middleware = new HttpLoggingMiddleware( async c => { await c.Features.Get <IHttpUpgradeFeature>().UpgradeAsync(); }, options, LoggerFactory.CreateLogger <HttpLoggingMiddleware>()); await middleware.Invoke(httpContext); Assert.Equal(1, writeCount); }
public async Task OriginalUpgradeFeatureIsRestoredBeforeMiddlewareCompletes(HttpLoggingFields loggingFields) { var options = CreateOptionsAccessor(); options.CurrentValue.LoggingFields = loggingFields; var letBodyFinish = new TaskCompletionSource(); var httpContext = new DefaultHttpContext(); var upgradeFeatureMock = new Mock <IHttpUpgradeFeature>(); upgradeFeatureMock.Setup(m => m.IsUpgradableRequest).Returns(true); upgradeFeatureMock.Setup(m => m.UpgradeAsync()).ReturnsAsync(Stream.Null); httpContext.Features.Set <IHttpUpgradeFeature>(upgradeFeatureMock.Object); IHttpUpgradeFeature upgradeFeature = null; var middleware = new HttpLoggingMiddleware( async c => { upgradeFeature = c.Features.Get <IHttpUpgradeFeature>(); await letBodyFinish.Task; }, options, LoggerFactory.CreateLogger <HttpLoggingMiddleware>()); var middlewareTask = middleware.Invoke(httpContext); Assert.True(upgradeFeature is UpgradeFeatureLoggingDecorator); letBodyFinish.SetResult(); await middlewareTask; Assert.False(httpContext.Features.Get <IHttpUpgradeFeature>() is UpgradeFeatureLoggingDecorator); }