private async Task <HttpResponseMessage> ExecuteRequestAsync(string url, HttpMethod httpMethod, RequestToken accessToken = null, Dictionary <string, string> extraOAuthPairs = null, Dictionary <string, string> queryParameters = null, Dictionary <string, string> formData = null) { var authorizationParts = new SortedDictionary <string, string>(extraOAuthPairs ?? new Dictionary <string, string>()) { { "oauth_consumer_key", Options.ConsumerKey }, { "oauth_nonce", Guid.NewGuid().ToString("N") }, { "oauth_signature_method", "HMAC-SHA1" }, { "oauth_timestamp", GenerateTimeStamp() }, { "oauth_version", "1.0" } }; if (accessToken != null) { authorizationParts.Add("oauth_token", accessToken.Token); } var signatureParts = new SortedDictionary <string, string>(authorizationParts); if (queryParameters != null) { foreach (var queryParameter in queryParameters) { signatureParts.Add(queryParameter.Key, queryParameter.Value); } } if (formData != null) { foreach (var formItem in formData) { signatureParts.Add(formItem.Key, formItem.Value); } } var parameterBuilder = new StringBuilder(); foreach (var signaturePart in signatureParts) { parameterBuilder.AppendFormat("{0}={1}&", Uri.EscapeDataString(signaturePart.Key), Uri.EscapeDataString(signaturePart.Value)); } parameterBuilder.Length--; var parameterString = parameterBuilder.ToString(); var canonicalizedRequestBuilder = new StringBuilder(); canonicalizedRequestBuilder.Append(httpMethod.Method); canonicalizedRequestBuilder.Append("&"); canonicalizedRequestBuilder.Append(Uri.EscapeDataString(url)); canonicalizedRequestBuilder.Append("&"); canonicalizedRequestBuilder.Append(Uri.EscapeDataString(parameterString)); var signature = ComputeSignature(Options.ConsumerSecret, accessToken?.TokenSecret, canonicalizedRequestBuilder.ToString()); authorizationParts.Add("oauth_signature", signature); var queryString = ""; if (queryParameters != null) { var queryStringBuilder = new StringBuilder("?"); foreach (var queryParam in queryParameters) { queryStringBuilder.AppendFormat("{0}={1}&", queryParam.Key, queryParam.Value); } queryStringBuilder.Length--; queryString = queryStringBuilder.ToString(); } var authorizationHeaderBuilder = new StringBuilder(); authorizationHeaderBuilder.Append("OAuth "); foreach (var authorizationPart in authorizationParts) { authorizationHeaderBuilder.AppendFormat("{0}=\"{1}\",", authorizationPart.Key, Uri.EscapeDataString(authorizationPart.Value)); } authorizationHeaderBuilder.Length--; var request = new HttpRequestMessage(httpMethod, url + queryString); request.Headers.Add("Authorization", authorizationHeaderBuilder.ToString()); if (formData != null) { request.Content = new FormUrlEncodedContent(formData); } return(await Backchannel.SendAsync(request, Context.RequestAborted)); }