public virtual OAuthMessage Read(string httpMethod, string httpContentType, Uri requestUri, System.IO.Stream incomingStream)
        {
            if (string.IsNullOrEmpty(httpMethod))
            {
                throw new ArgumentOutOfRangeException("httpMethod");
            }
            if (requestUri == null)
            {
                throw new ArgumentNullException("requestUri");
            }
            if (incomingStream == null)
            {
                throw new ArgumentNullException("incomingStream");
            }

            Dictionary <string, string> oAuthParameters = new Dictionary <string, string>();

            if (httpMethod == "POST")
            {
                if (httpContentType.Contains("application/x-www-form-urlencoded"))
                {
                    oAuthParameters = this.ReadFormEncodedParameters(incomingStream);
                }
                else
                {
                    if (!httpContentType.Contains("application/json"))
                    {
                        throw new OAuthMessageSerializationException(string.Format(Resources.ID3721, httpMethod, httpContentType));
                    }
                    oAuthParameters = this.ReadJsonEncodedParameters(incomingStream);
                }
            }
            else
            {
                if (!(httpMethod == "GET"))
                {
                    throw new OAuthMessageSerializationException(string.Format(Resources.ID3722, httpMethod));
                }
                oAuthParameters = HttpQueryStringParser.Parse(requestUri.Query);
            }
            return(this.CreateTypedOAuthMessageFromParameters(OAuthMessageSerializer.GetBaseUrl(requestUri), oAuthParameters));
        }
        /// <summary>
        /// Authorizes the specified refresh token.
        /// </summary>
        /// <param name="refreshToken">The refresh token.</param>
        public async Task AuthorizeAsync(string refreshToken)
        {
            var authorizeRequest = BuildAccessTokenRequest(refreshToken);

            var req = new HttpClient();
            var response = await req.PostAsync(authorizeRequest.BaseUri, new FormUrlEncodedContent(authorizeRequest.Parameters));

            var serializer = new OAuthMessageSerializer();

            var deserializedMessage = await serializer.Read(response);

            var message = deserializedMessage as AccessTokenResponse;
            if (message != null)
            {
                CurrentAccessToken = message;
                LastAccessTokenRefresh = DateTime.UtcNow;
            }

            var endUserAuthorizationFailedResponse = deserializedMessage as EndUserAuthorizationFailedResponse;
            if (endUserAuthorizationFailedResponse != null)
            {
                throw new SecurityException(endUserAuthorizationFailedResponse.ErrorDescription);
            }

            var userAuthorizationFailedResponse = deserializedMessage as ResourceAccessFailureResponse;
            if (userAuthorizationFailedResponse != null)
            {
                throw new SecurityException(userAuthorizationFailedResponse.ErrorDescription);
            }
        }