99using System . Threading . Tasks ;
1010using System . Web . Script . Serialization ;
1111using System . Web ;
12+ using System . Threading ;
1213
1314namespace SendGrid . CSharp . HTTP . Client
1415{
@@ -258,6 +259,7 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
258259
259260 if ( Enum . IsDefined ( typeof ( Methods ) , binder . Name . ToUpper ( ) ) )
260261 {
262+ CancellationToken cancellationToken = CancellationToken . None ;
261263 string queryParams = null ;
262264 string requestBody = null ;
263265 int i = 0 ;
@@ -278,9 +280,13 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
278280 {
279281 AddRequestHeader ( ( Dictionary < string , string > ) obj ) ;
280282 }
283+ else if ( name == "cancellationToken" )
284+ {
285+ cancellationToken = ( CancellationToken ) obj ;
286+ }
281287 i ++ ;
282288 }
283- result = RequestAsync ( binder . Name . ToUpper ( ) , requestBody : requestBody , queryParams : queryParams ) . ConfigureAwait ( false ) ;
289+ result = RequestAsync ( binder . Name . ToUpper ( ) , cancellationToken , requestBody : requestBody , queryParams : queryParams ) . ConfigureAwait ( false ) ;
284290 return true ;
285291 }
286292 else
@@ -296,21 +302,23 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o
296302 /// </summary>
297303 /// <param name="client">Client object ready for communication with API</param>
298304 /// <param name="request">The parameters for the API call</param>
305+ /// <param name="cancellationToken">A token that allows cancellation of the http request</param>
299306 /// <returns>Response object</returns>
300- public async virtual Task < Response > MakeRequest ( HttpClient client , HttpRequestMessage request )
307+ public async virtual Task < Response > MakeRequest ( HttpClient client , HttpRequestMessage request , CancellationToken cancellationToken )
301308 {
302- HttpResponseMessage response = await client . SendAsync ( request ) . ConfigureAwait ( false ) ;
309+ HttpResponseMessage response = await client . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
303310 return new Response ( response . StatusCode , response . Content , response . Headers ) ;
304311 }
305312
306313 /// <summary>
307314 /// Prepare for async call to the API server
308315 /// </summary>
309316 /// <param name="method">HTTP verb</param>
317+ /// <param name="cancellationToken">A token that allows cancellation of the http request</param>
310318 /// <param name="requestBody">JSON formatted string</param>
311319 /// <param name="queryParams">JSON formatted queary paramaters</param>
312320 /// <returns>Response object</returns>
313- private async Task < Response > RequestAsync ( string method , string requestBody = null , string queryParams = null )
321+ private async Task < Response > RequestAsync ( string method , CancellationToken cancellationToken , string requestBody = null , string queryParams = null )
314322 {
315323 using ( var client = BuildHttpClient ( ) )
316324 {
@@ -356,9 +364,13 @@ private async Task<Response> RequestAsync(string method, string requestBody = nu
356364 RequestUri = new Uri ( endpoint ) ,
357365 Content = content
358366 } ;
359- return await MakeRequest ( client , request ) . ConfigureAwait ( false ) ;
367+ return await MakeRequest ( client , request , cancellationToken ) . ConfigureAwait ( false ) ;
360368
361369 }
370+ catch ( TaskCanceledException )
371+ {
372+ throw ;
373+ }
362374 catch ( Exception ex )
363375 {
364376 HttpResponseMessage response = new HttpResponseMessage ( ) ;
0 commit comments