private async Task LogRequest(HttpRequestResponseLoggingOptions httpRequestResponseLoggingOptions, HttpRequest request)
        {
            var requestOptions = httpRequestResponseLoggingOptions.Request ?? new HttpRequestResponseOptions();

            if (!requestOptions.IsEnabled)
            {
                return;
            }

            request.EnableBuffering();

            await using var requestStream = _recyclableMemoryStreamManager.GetStream();

            await request.Body.CopyToAsync(requestStream);

            var stringBuilder = CreateStringBuilder("Http Request Information...");
            var @params       = CreateParams(request);

            if (requestOptions.IncludeHeaders)
            {
                stringBuilder.AppendLine("Headers: {headers}");
                @params.Add(request.Headers.ToImmutableArray());
            }

            if (requestOptions.IncludeBody)
            {
                stringBuilder.AppendLine("Request Body: {requestBody}");
                @params.Add(ReadStreamInChunks(requestStream));
            }

            _logger.LogInformation(stringBuilder.ToString(), @params.ToArray());

            request.Body.Position = 0;
        }
        private async Task LogResponse(HttpRequestResponseLoggingOptions httpRequestResponseLoggingOptions, HttpContext context)
        {
            var responseOptions = httpRequestResponseLoggingOptions.Response ?? new HttpRequestResponseOptions();

            if (!responseOptions.IsEnabled)
            {
                await _next(context);

                return;
            }

            var response   = context.Response;
            var bodyStream = response.Body;

            await using var responseStream = _recyclableMemoryStreamManager.GetStream();
            response.Body = responseStream;

            await _next(context);

            response.Body.Seek(0, SeekOrigin.Begin);
            var responseText = await new StreamReader(response.Body).ReadToEndAsync();

            response.Body.Seek(0, SeekOrigin.Begin);

            var stringBuilder = CreateStringBuilder("Http Response Information...");
            var @params       = CreateParams(context.Request);

            if (responseOptions.IncludeHeaders)
            {
                stringBuilder.AppendLine("Headers: {headers}");
                @params.Add(response.Headers.ToImmutableArray());
            }

            if (responseOptions.IncludeBody)
            {
                stringBuilder.AppendLine("Response Body: {text}");
                @params.Add(responseText);
            }

            _logger.LogInformation(stringBuilder.ToString(), @params.ToArray());

            await responseStream.CopyToAsync(bodyStream);
        }