Created
January 25, 2023 16:03
-
-
Save mikegoatly/a1ee43b1fa8eb45b91978965d63e0349 to your computer and use it in GitHub Desktop.
HttpLoggingHandler using Refit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Based on https://medium.com/@florian.baader/log-http-requests-with-refit-81ee47bffb05 | |
Usage: | |
services.AddRefitClient<TClient>(refitSettings) | |
.ConfigureHttpMessageHandlerBuilder(b => b.AdditionalHandlers.Add(new HttpLoggingHandler())); | |
*/ | |
public class HttpLoggingHandler : DelegatingHandler | |
{ | |
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, | |
CancellationToken cancellationToken) | |
{ | |
var req = request; | |
var id = Guid.NewGuid().ToString(); | |
var msg = $"[{id} - Request]"; | |
Debug.WriteLine($"{msg}========Start=========="); | |
Debug.WriteLine($"{msg} {req.Method} {req.RequestUri?.PathAndQuery} {req.RequestUri?.Scheme}/{req.Version}"); | |
Debug.WriteLine($"{msg} Host: {req.RequestUri?.Scheme}://{req.RequestUri?.Host}"); | |
foreach (var header in req.Headers) | |
{ | |
Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}"); | |
} | |
if (req.Content != null) | |
{ | |
foreach (var header in req.Content.Headers) | |
{ | |
Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}"); | |
} | |
if (req.Content is StringContent || this.IsTextBasedContentType(req.Headers) || | |
this.IsTextBasedContentType(req.Content.Headers)) | |
{ | |
var result = await req.Content.ReadAsStringAsync(cancellationToken); | |
Debug.WriteLine($"{msg} Content:"); | |
Debug.WriteLine($"{msg} {result}"); | |
} | |
} | |
var start = DateTime.Now; | |
var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); | |
var end = DateTime.Now; | |
Debug.WriteLine($"{msg} Duration: {end - start}"); | |
Debug.WriteLine($"{msg}==========End=========="); | |
msg = $"[{id} - Response]"; | |
Debug.WriteLine($"{msg}=========Start========="); | |
var resp = response; | |
Debug.WriteLine( | |
$"{msg} {req.RequestUri?.Scheme.ToUpper(CultureInfo.InvariantCulture)}/{resp.Version} {(int)resp.StatusCode} {resp.ReasonPhrase}"); | |
foreach (var header in resp.Headers) | |
{ | |
Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}"); | |
} | |
if (resp.Content != null) | |
{ | |
foreach (var header in resp.Content.Headers) | |
{ | |
Debug.WriteLine($"{msg} {header.Key}: {string.Join(", ", header.Value)}"); | |
} | |
if (resp.Content is StringContent || this.IsTextBasedContentType(resp.Headers) || | |
this.IsTextBasedContentType(resp.Content.Headers)) | |
{ | |
start = DateTime.Now; | |
var result = await resp.Content.ReadAsStringAsync(cancellationToken); | |
end = DateTime.Now; | |
Debug.WriteLine($"{msg} Content:"); | |
Debug.WriteLine($"{msg} {result}"); | |
Debug.WriteLine($"{msg} Duration: {end - start}"); | |
} | |
} | |
Debug.WriteLine($"{msg}==========End=========="); | |
return response; | |
} | |
private readonly string[] types = new[] { "html", "text", "xml", "json", "txt", "x-www-form-urlencoded" }; | |
private bool IsTextBasedContentType(HttpHeaders headers) | |
{ | |
if (!headers.TryGetValues("Content-Type", out var values)) | |
{ | |
return false; | |
} | |
var header = string.Join(" ", values); | |
return this.types.Any(t => header.Contains(t, StringComparison.OrdinalIgnoreCase)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment