99using System . Threading . Tasks ;
1010using System . Web . Script . Serialization ;
1111using System . Web ;
12+ using System . Threading ;
1213
1314namespace SendGrid . CSharp . HTTP . Client
1415{
@@ -266,6 +267,7 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
266267
267268 if ( Enum . IsDefined ( typeof ( Methods ) , binder . Name . ToUpper ( ) ) )
268269 {
270+ CancellationToken cancellationToken = CancellationToken . None ;
269271 string queryParams = null ;
270272 string requestBody = null ;
271273 int i = 0 ;
@@ -286,9 +288,13 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
286288 {
287289 AddRequestHeader ( ( Dictionary < string , string > ) obj ) ;
288290 }
291+ else if ( name == "cancellationToken" )
292+ {
293+ cancellationToken = ( CancellationToken ) obj ;
294+ }
289295 i ++ ;
290296 }
291- result = RequestAsync ( binder . Name . ToUpper ( ) , requestBody : requestBody , queryParams : queryParams ) . ConfigureAwait ( false ) ;
297+ result = RequestAsync ( binder . Name . ToUpper ( ) , requestBody : requestBody , queryParams : queryParams , cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ;
292298 return true ;
293299 }
294300 else
@@ -304,22 +310,24 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
304310 /// </summary>
305311 /// <param name="client">Client object ready for communication with API</param>
306312 /// <param name="request">The parameters for the API call</param>
313+ /// <param name="cancellationToken">A token that allows cancellation of the http request</param>
307314 /// <returns>Response object</returns>
308- public async virtual Task < Response > MakeRequest ( HttpClient client , HttpRequestMessage request )
315+ public async virtual Task < Response > MakeRequest ( HttpClient client , HttpRequestMessage request , CancellationToken cancellationToken = default ( CancellationToken ) )
309316 {
310317
311- HttpResponseMessage response = await client . SendAsync ( request ) . ConfigureAwait ( false ) ;
318+ HttpResponseMessage response = await client . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
312319 return new Response ( response . StatusCode , response . Content , response . Headers ) ;
313320 }
314321
315322 /// <summary>
316323 /// Prepare for async call to the API server
317324 /// </summary>
318325 /// <param name="method">HTTP verb</param>
326+ /// <param name="cancellationToken">A token that allows cancellation of the http request</param>
319327 /// <param name="requestBody">JSON formatted string</param>
320328 /// <param name="queryParams">JSON formatted queary paramaters</param>
321329 /// <returns>Response object</returns>
322- private async Task < Response > RequestAsync ( string method , String requestBody = null , String queryParams = null )
330+ private async Task < Response > RequestAsync ( string method , String requestBody = null , String queryParams = null , CancellationToken cancellationToken = default ( CancellationToken ) )
323331 {
324332 using ( var client = new HttpClient ( ) )
325333 {
@@ -367,9 +375,13 @@ private async Task<Response> RequestAsync(string method, String requestBody = nu
367375 RequestUri = new Uri ( endpoint ) ,
368376 Content = content
369377 } ;
370- return await MakeRequest ( client , request ) . ConfigureAwait ( false ) ;
378+ return await MakeRequest ( client , request , cancellationToken ) . ConfigureAwait ( false ) ;
371379
372380 }
381+ catch ( TaskCanceledException )
382+ {
383+ throw ;
384+ }
373385 catch ( Exception ex )
374386 {
375387 HttpResponseMessage response = new HttpResponseMessage ( ) ;
0 commit comments