Index: Src/GoogleApis.Auth/OAuth2/TokenRequestExtenstions.cs
===================================================================
new file mode 100644
--- /dev/null
+++ b/Src/GoogleApis.Auth/OAuth2/TokenRequestExtenstions.cs
@@ -0,0 +1,66 @@
+/*
+Copyright 2013 Google Inc
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+
+using Google.Apis.Auth.OAuth2.Requests;
+using Google.Apis.Auth.OAuth2.Responses;
+using Google.Apis.Json;
+using Google.Apis.Requests.Parameters;
+using Google.Apis.Util;
+
+namespace Google.Apis.Auth.OAuth2
+{
+ ///
+ /// Extension methods to .
+ ///
+ internal static class TokenRequestExtenstions
+ {
+ ///
+ /// Executes the token request in order to receive a
+ /// . In case the token server returns an
+ /// error, a is thrown.
+ ///
+ /// The token request.
+ /// The HTTP client used to create an HTTP request.
+ /// The token server URL.
+ /// Cancellation token to cancel operation.
+ /// The clock which is used to set the property.
+ /// Token response with the new access token.
+ public static async Task Execute(this TokenRequest request, HttpClient httpClient,
+ string tokenServerUrl, CancellationToken taskCancellationToken, IClock clock)
+ {
+ var httpRequest = new HttpRequestMessage(HttpMethod.Post, tokenServerUrl);
+ httpRequest.Content = ParameterUtils.CreateFormUrlEncodedContent(request);
+
+ var response = await httpClient.SendAsync(httpRequest, taskCancellationToken).ConfigureAwait(false);
+ var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+
+ if (!response.IsSuccessStatusCode)
+ {
+ var error = NewtonsoftJsonSerializer.Instance.Deserialize(content);
+ throw new TokenResponseException(error);
+ }
+
+ // Gets the token and sets its issued time.
+ var newToken = NewtonsoftJsonSerializer.Instance.Deserialize(content);
+ newToken.Issued = clock.Now;
+ return newToken;
+ }
+ }
+}