@@ -39,7 +39,7 @@ public async Task ProcessAsync(HttpClient httpClient, Func<RequestResult, Task>
3939 }
4040
4141 var random = new Random ( ) ;
42- var activeRequests = new ConcurrentDictionary < Task , RequestContext > ( options . MaxNumberOfSimultaneousRequests , options . MaxNumberOfSimultaneousRequests ) ;
42+ var activeRequests = new ConcurrentDictionary < Task < RequestResult > , RequestContext > ( options . MaxNumberOfSimultaneousRequests , options . MaxNumberOfSimultaneousRequests ) ;
4343
4444 var currentBackoff = 0 ;
4545 var successesSinceLastThrottle = 0 ;
@@ -77,7 +77,7 @@ public async Task ProcessAsync(HttpClient httpClient, Func<RequestResult, Task>
7777
7878 Logger ? . LogDebug ( $ "Request #{ requestContext . RequestNumber } ({ requestUri } ) starting with a { requestStartDelay } ms delay.") ;
7979
80- var task = PerformRequestAsync ( httpClient , responseAction , requestContext ) ;
80+ var task = PerformRequestAsync ( httpClient , requestContext ) ;
8181
8282 activeRequests . TryAdd ( task , requestContext ) ;
8383 requestCount ++ ;
@@ -91,6 +91,8 @@ public async Task ProcessAsync(HttpClient httpClient, Func<RequestResult, Task>
9191
9292 await Task . WhenAny ( activeRequests . Keys ) . ConfigureAwait ( false ) ;
9393
94+ cancellationToken . ThrowIfCancellationRequested ( ) ;
95+
9496 var completedRequests = activeRequests . Keys . Where ( t => t . IsCompleted ) ;
9597 foreach ( var completedRequest in completedRequests )
9698 {
@@ -105,6 +107,8 @@ public async Task ProcessAsync(HttpClient httpClient, Func<RequestResult, Task>
105107 ExceptionDispatchInfo . Capture ( aggregateException . InnerException ) . Throw ( ) ;
106108 }
107109
110+ await responseAction ( completedRequest . Result ) ;
111+
108112 //Manage the throttling based on timeouts and successes
109113 var throttlePoint = options . TimeoutBeforeThrottle ;
110114 if ( throttlePoint . TotalMilliseconds > 0 && requestContext . Timer . Elapsed > throttlePoint )
@@ -130,7 +134,7 @@ public async Task ProcessAsync(HttpClient httpClient, Func<RequestResult, Task>
130134 Logger ? . LogDebug ( $ "Completed processing { requestCount } requests.") ;
131135 }
132136
133- private async Task PerformRequestAsync ( HttpClient httpClient , Func < RequestResult , Task > responseAction , RequestContext context )
137+ private async Task < RequestResult > PerformRequestAsync ( HttpClient httpClient , RequestContext context )
134138 {
135139 if ( context . RequestStartDelay > 0 )
136140 {
@@ -146,7 +150,9 @@ private async Task PerformRequestAsync(HttpClient httpClient, Func<RequestResult
146150 var combinedToken = CancellationTokenSource . CreateLinkedTokenSource ( context . CancellationToken , timeoutToken ) . Token ;
147151 using ( var response = await httpClient . GetAsync ( context . RequestUri , combinedToken ) )
148152 {
149- await response . Content . LoadIntoBufferAsync ( ) ;
153+ var contentStream = new MemoryStream ( ) ;
154+ await response . Content . CopyToAsync ( contentStream ) ;
155+ contentStream . Seek ( 0 , SeekOrigin . Begin ) ;
150156
151157 //We only want to time the request, not the handling of the response
152158 context . Timer . Stop ( ) ;
@@ -155,19 +161,23 @@ private async Task PerformRequestAsync(HttpClient httpClient, Func<RequestResult
155161
156162 Logger ? . LogDebug ( $ "Request #{ context . RequestNumber } completed successfully in { context . Timer . ElapsedMilliseconds } ms.") ;
157163
158- await responseAction ( new RequestResult
164+ return new RequestResult
159165 {
160166 RequestUri = context . RequestUri ,
161167 RequestStart = requestStart ,
162168 RequestStartDelay = context . RequestStartDelay ,
163- ResponseMessage = response ,
169+ StatusCode = response . StatusCode ,
170+ ResponseHeaders = response . Headers ,
171+ ContentHeaders = response . Content . Headers ,
172+ Content = contentStream ,
164173 ElapsedTime = context . Timer . Elapsed
165- } ) ;
174+ } ;
166175 }
167176 }
168177 catch ( OperationCanceledException ) when ( context . CancellationToken . IsCancellationRequested )
169178 {
170179 Logger ? . LogDebug ( $ "Request #{ context . RequestNumber } cancelled.") ;
180+ return null ;
171181 }
172182 catch ( Exception ex ) when ( ex is HttpRequestException || ex is OperationCanceledException )
173183 {
@@ -176,14 +186,14 @@ await responseAction(new RequestResult
176186 Logger ? . LogDebug ( $ "Request #{ context . RequestNumber } completed with error in { context . Timer . ElapsedMilliseconds } ms.") ;
177187 Logger ? . LogTrace ( ex , $ "Request #{ context . RequestNumber } Exception: { ex . Message } ") ;
178188
179- await responseAction ( new RequestResult
189+ return new RequestResult
180190 {
181191 RequestUri = context . RequestUri ,
182192 RequestStart = requestStart ,
183193 RequestStartDelay = context . RequestStartDelay ,
184194 ElapsedTime = context . Timer . Elapsed ,
185195 Exception = ex
186- } ) ;
196+ } ;
187197 }
188198 }
189199 }
0 commit comments