/// <summary>
        /// Initializes a new instance of the <see cref="TwitterOAuthRequestBuilder"/> class.
        /// Authorization request builder.
        /// </summary>
        /// <param name="requestUri">Request Uri.</param>
        /// <param name="tokens">Tokens to form request.</param>
        /// <param name="signatureManager">Signature manager to sign the OAuth request</param>
        /// <param name="method">Method to use with request.</param>
        public TwitterOAuthRequestBuilder(Uri requestUri, TwitterOAuthTokens tokens, ISignatureManager signatureManager, string method = "GET")
        {
            _signatureManager = signatureManager;
            Verb = method;

            RequestUriWithoutQuery = new Uri(requestUri.AbsoluteWithoutQuery());

            if (!string.IsNullOrEmpty(requestUri.Query))
            {
                QueryParams = requestUri.GetQueryParams()
                              .Select(p => new OAuthParameter(p.Key, Uri.UnescapeDataString(p.Value)))
                              .ToList();
            }
            else
            {
                QueryParams = new List <OAuthParameter>();
            }

            EncodedRequestUri = GetEncodedUri(requestUri, QueryParams);

            Version         = new OAuthParameter("oauth_version", "1.0");
            Nonce           = new OAuthParameter("oauth_nonce", GenerateNonce());
            Timestamp       = new OAuthParameter("oauth_timestamp", GenerateTimeStamp());
            SignatureMethod = new OAuthParameter("oauth_signature_method", "HMAC-SHA1");
            ConsumerKey     = new OAuthParameter("oauth_consumer_key", tokens.ConsumerKey);
            ConsumerSecret  = new OAuthParameter("oauth_consumer_secret", tokens.ConsumerSecret);
            Token           = new OAuthParameter("oauth_token", tokens.AccessToken);
            TokenSecret     = new OAuthParameter("oauth_token_secret", tokens.AccessTokenSecret);
        }
        private static Uri GetEncodedUri(Uri requestUri, IEnumerable <OAuthParameter> parameters)
        {
            StringBuilder requestParametersBuilder = new StringBuilder(requestUri.AbsoluteWithoutQuery());

            if (parameters.Count() > 0)
            {
                requestParametersBuilder.Append("?");

                foreach (var queryParam in parameters)
                {
                    requestParametersBuilder.AppendFormat("{0}&", queryParam.ToString());
                }

                requestParametersBuilder.Remove(requestParametersBuilder.Length - 1, 1);
            }

            return(new Uri(requestParametersBuilder.ToString()));
        }
        /// <summary>
        /// Get encoded Uri.
        /// </summary>
        /// <param name="requestUri">Request uri.</param>
        /// <param name="parameters">List of parameters.</param>
        /// <returns>Encoded Uri.</returns>
        private static Uri GetEncodedUri(Uri requestUri, IEnumerable<OAuthParameter> parameters)
        {
            StringBuilder requestParametersBuilder = new StringBuilder(requestUri.AbsoluteWithoutQuery());
            var oAuthParameters = parameters as OAuthParameter[] ?? parameters.ToArray();
            if (oAuthParameters.Any())
            {
                requestParametersBuilder.Append("?");

                foreach (var queryParam in oAuthParameters)
                {
                    requestParametersBuilder.AppendFormat("{0}&", queryParam.ToString());
                }

                requestParametersBuilder.Remove(requestParametersBuilder.Length - 1, 1);
            }

            return new Uri(requestParametersBuilder.ToString());
        }
        public OAuthRequestBuilder(Uri requestUri, OAuthTokens tokens)
        {
            RequestUriWithoutQuery = new Uri(requestUri.AbsoluteWithoutQuery());

            QueryParams = requestUri.GetQueryParams()
                          .Select(p => new OAuthParameter(p.Key, p.Value))
                          .ToList();

            EncodedRequestUri = GetEncodedUri(requestUri, QueryParams);

            Version         = new OAuthParameter("oauth_version", "1.0");
            Nonce           = new OAuthParameter("oauth_nonce", GenerateNonce());
            Timestamp       = new OAuthParameter("oauth_timestamp", GenerateTimeStamp());
            SignatureMethod = new OAuthParameter("oauth_signature_method", "HMAC-SHA1");
            ConsumerKey     = new OAuthParameter("oauth_consumer_key", tokens["ConsumerKey"]);
            ConsumerSecret  = new OAuthParameter("oauth_consumer_secret", tokens["ConsumerSecret"]);
            Token           = new OAuthParameter("oauth_token", tokens["AccessToken"]);
            TokenSecret     = new OAuthParameter("oauth_token_secret", tokens["AccessTokenSecret"]);
        }