@@ -7,98 +7,49 @@ namespace Dibix.Http.Client
77 public class HttpRequestTracer
88 {
99 public bool MaskSensitiveContent { get ; } = true ;
10- public HttpRequestTrace LastRequest { get ; private set ; }
1110
1211 public HttpRequestTracer ( ) { }
1312 public HttpRequestTracer ( bool maskSensitiveContent )
1413 {
1514 this . MaskSensitiveContent = maskSensitiveContent ;
1615 }
1716
18- internal async Task TraceRequestMessageAsync ( HttpRequestMessage requestMessage )
17+ internal async Task TraceRequestAsync ( HttpRequestMessage requestMessage )
1918 {
20- await this . CollectLastRequest ( requestMessage ) . ConfigureAwait ( false ) ;
21- await this . TraceRequestAsync ( requestMessage ) . ConfigureAwait ( false ) ;
19+ HttpRequestTrace requestTrace = CreateRequestTrace ( ) ;
20+ requestMessage . SetHttpRequestTrace ( requestTrace ) ;
21+ await this . TraceRequestAsync ( requestMessage , requestTrace ) . ConfigureAwait ( false ) ;
2222 }
2323
24- internal async Task TraceResponseMessageAsync ( HttpResponseMessage responseMessage , TimeSpan duration )
24+ internal async Task TraceResponseAsync ( HttpResponseMessage responseMessage , TimeSpan duration )
2525 {
26- await CompleteLastRequest ( responseMessage , duration ) . ConfigureAwait ( false ) ;
27- await this . TraceResponseAsync ( responseMessage , duration ) ;
26+ HttpRequestTrace requestTrace = responseMessage . RequestMessage . GetHttpRequestTrace ( ) ;
27+ CompleteLastRequest ( requestTrace , duration ) ;
28+ await this . TraceResponseAsync ( responseMessage , requestTrace ) ;
2829 }
2930
30- protected virtual Task TraceRequestAsync ( HttpRequestMessage requestMessage ) => Task . CompletedTask ;
31+ protected virtual Task TraceRequestAsync ( HttpRequestMessage requestMessage , HttpRequestTrace requestTrace ) => Task . CompletedTask ;
3132
32- protected virtual Task TraceResponseAsync ( HttpResponseMessage responseMessage , TimeSpan duration ) => Task . CompletedTask ;
33+ protected virtual Task TraceResponseAsync ( HttpResponseMessage responseMessage , HttpRequestTrace requestTrace ) => Task . CompletedTask ;
3334
34- protected virtual bool ShouldBufferRequestContent ( HttpRequestMessage requestMessage ) => false ;
35+ private protected virtual HttpRequestTrace CreateRequestTrace ( ) => new HttpRequestTrace ( ) ;
3536
36- protected virtual bool ShouldBufferResponseContent ( HttpRequestMessage requestMessage ) => false ;
37-
38- private async Task CollectLastRequest ( HttpRequestMessage requestMessage )
39- {
40- string formattedRequestText = await this . GetFormattedRequestContent ( requestMessage ) . ConfigureAwait ( false ) ;
41- this . LastRequest = new HttpRequestTrace ( requestMessage , formattedRequestText ) ;
42- }
43-
44- private async Task CompleteLastRequest ( HttpResponseMessage responseMessage , TimeSpan duration )
45- {
46- if ( this . LastRequest == null )
47- throw new InvalidOperationException ( "Request not initialized" ) ;
48-
49- string formattedResponseText = await this . GetFormattedResponseContent ( responseMessage ) . ConfigureAwait ( false ) ;
50- this . LastRequest . ResponseMessage = responseMessage ;
51- this . LastRequest . FormattedResponseText = formattedResponseText ;
52- this . LastRequest . Duration = duration ;
53-
54- // Since non successful status code will throw an exception,
55- // it is now safe to restore the request content, that was not previously captured
56- HttpRequestMessage requestMessage = responseMessage . RequestMessage ;
57- if ( ! this . ShouldBufferRequestContent ( requestMessage ) && ! responseMessage . IsSuccessStatusCode )
58- {
59- string requestContentText = await GetRequestContentTextAsync ( requestMessage , bufferRequestContent : true ) . ConfigureAwait ( false ) ;
60- this . LastRequest . FormattedRequestText = this . FormatRequest ( requestMessage , requestContentText ) ;
61- }
62- }
63-
64- private async Task < string > GetFormattedRequestContent ( HttpRequestMessage requestMessage )
65- {
66- bool bufferRequestContent = this . ShouldBufferRequestContent ( requestMessage ) ;
67- string requestContentText = await GetRequestContentTextAsync ( requestMessage , bufferRequestContent ) . ConfigureAwait ( false ) ;
68- string formattedRequestText = this . FormatRequest ( requestMessage , requestContentText ) ;
69- return formattedRequestText ;
70- }
71-
72- private async Task < string > GetFormattedResponseContent ( HttpResponseMessage responseMessage )
37+ private static void CompleteLastRequest ( HttpRequestTrace requestTrace , TimeSpan duration )
7338 {
74- bool bufferResponseContent = this . ShouldBufferResponseContent ( responseMessage . RequestMessage ) || ! responseMessage . IsSuccessStatusCode ;
75- string responseContentTest = await GetResponseContentTextAsync ( responseMessage , bufferResponseContent ) . ConfigureAwait ( false ) ;
76- string formattedResponseText = HttpMessageFormatter . Format ( responseMessage , responseContentTest ) ;
77- return formattedResponseText ;
39+ requestTrace . Duration = duration ;
7840 }
41+ }
7942
80- private string FormatRequest ( HttpRequestMessage requestMessage , string requestContentText ) => HttpMessageFormatter . Format ( requestMessage , requestContentText , this . MaskSensitiveContent ) ;
81-
82- private static async Task < string > GetRequestContentTextAsync ( HttpRequestMessage requestMessage , bool bufferRequestContent )
83- {
84- if ( requestMessage . Content == null )
85- return null ;
86-
87- if ( ! bufferRequestContent )
88- return "<Request content unavailable>" ;
43+ public class HttpRequestTracer < T > : HttpRequestTracer where T : HttpRequestTrace , new ( )
44+ {
45+ protected sealed override Task TraceRequestAsync ( HttpRequestMessage requestMessage , HttpRequestTrace requestTrace ) => this . TraceRequestAsync ( requestMessage , ( T ) requestTrace ) ;
8946
90- return await requestMessage . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
91- }
47+ protected sealed override Task TraceResponseAsync ( HttpResponseMessage responseMessage , HttpRequestTrace requestTrace ) => this . TraceResponseAsync ( responseMessage , ( T ) requestTrace ) ;
9248
93- private static async Task < string > GetResponseContentTextAsync ( HttpResponseMessage responseMessage , bool bufferResponseContent )
94- {
95- if ( responseMessage . Content == null )
96- return null ;
49+ private protected sealed override HttpRequestTrace CreateRequestTrace ( ) => new T ( ) ;
9750
98- if ( ! bufferResponseContent )
99- return "<Response content unavailable>" ;
51+ protected virtual Task TraceRequestAsync ( HttpRequestMessage requestMessage , T requestTrace ) => Task . CompletedTask ;
10052
101- return await responseMessage . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
102- }
53+ protected virtual Task TraceResponseAsync ( HttpResponseMessage responseMessage , T requestTrace ) => Task . CompletedTask ;
10354 }
10455}
0 commit comments