File: UpgradeFeatureLoggingDecorator.cs
Web Access
Project: src\src\Middleware\HttpLogging\src\Microsoft.AspNetCore.HttpLogging.csproj (Microsoft.AspNetCore.HttpLogging)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
 
namespace Microsoft.AspNetCore.HttpLogging;
 
internal sealed class UpgradeFeatureLoggingDecorator : IHttpUpgradeFeature
{
    private readonly IHttpUpgradeFeature _innerUpgradeFeature;
    private readonly HttpLoggingInterceptorContext _logContext;
    private readonly HttpLoggingOptions _options;
    private readonly IHttpLoggingInterceptor[] _interceptors;
    private readonly ILogger _logger;
 
    private bool _isUpgraded;
 
    public UpgradeFeatureLoggingDecorator(IHttpUpgradeFeature innerUpgradeFeature, HttpLoggingInterceptorContext logContext, HttpLoggingOptions options,
        IHttpLoggingInterceptor[] interceptors, ILogger logger)
    {
        _innerUpgradeFeature = innerUpgradeFeature ?? throw new ArgumentNullException(nameof(innerUpgradeFeature));
        _logContext = logContext ?? throw new ArgumentNullException(nameof(logContext));
        _options = options ?? throw new ArgumentNullException(nameof(options));
        _interceptors = interceptors;
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
    }
 
    public bool IsUpgradableRequest => _innerUpgradeFeature.IsUpgradableRequest;
 
    public bool IsUpgraded { get => _isUpgraded; }
 
    public async Task<Stream> UpgradeAsync()
    {
        var upgradeStream = await _innerUpgradeFeature.UpgradeAsync();
        _isUpgraded = true;
 
        await HttpLoggingMiddleware.LogResponseHeadersAsync(_logContext, _options, _interceptors, _logger);
 
        return upgradeStream;
    }
}