using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Server.IntegrationTesting { public class LoggingHandler: DelegatingHandler { private readonly int _maxBodyLogSize = 16 * 1024; private readonly ILogger _logger; public LoggingHandler(HttpMessageHandler innerHandler, ILogger logger) : base(innerHandler) { _logger = logger; } protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { _logger.LogDebug(request.ToString()); var response = await base.SendAsync(request, cancellationToken); await LogResponse(response.IsSuccessStatusCode ? LogLevel.Debug : LogLevel.Warning, response); return response; } private async Task LogResponse(LogLevel logLevel, HttpResponseMessage response) { _logger.Log(logLevel, response.ToString()); if (response.Content != null) { await response.Content.LoadIntoBufferAsync(); var readAsStreamAsync = await response.Content.ReadAsStreamAsync(); var buffer = new byte[_maxBodyLogSize]; var offset = 0; var count = 0; do { count = await readAsStreamAsync.ReadAsync(buffer, offset, buffer.Length - offset); offset += count; } while (count != 0 && offset != buffer.Length); _logger.Log(logLevel, Encoding.ASCII.GetString(buffer, 0, offset)); } } } }