internal async Task <string> HttpGetAsync(string oauthUrl, IDictionary <string, string> parameters)
        {
            var req = new HttpRequestMessage(HttpMethod.Get, oauthUrl);

            req.Headers.Add("Authorization", GetAuthorizationString(HttpMethod.Get.ToString(), oauthUrl, parameters));
            req.Headers.Add("User-Agent", UserAgent);
            req.Headers.ExpectContinue = false;

            var handler = new HttpClientHandler();

            if (handler.SupportsAutomaticDecompression)
            {
                handler.AutomaticDecompression = DecompressionMethods.GZip;
            }
            if (Proxy != null && handler.SupportsProxy)
            {
                handler.Proxy = Proxy;
            }

            var msg = await new HttpClient(handler).SendAsync(req).ConfigureAwait(false);

            await TwitterErrorHandler.ThrowIfErrorAsync(msg).ConfigureAwait(false);

            return(await msg.Content.ReadAsStringAsync().ConfigureAwait(false));
        }
        async Task GetBearerTokenAsync()
        {
            var req = new HttpRequestMessage(System.Net.Http.HttpMethod.Post, OAuth2Token);

            req.Headers.Add("Authorization", "Basic " + BasicToken);
            req.Headers.Add("User-Agent", UserAgent);
            req.Headers.ExpectContinue = false;
            req.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");

            var handler = new HttpClientHandler();

            if (handler.SupportsAutomaticDecompression)
            {
                handler.AutomaticDecompression = DecompressionMethods.GZip;
            }
            if (Proxy != null && handler.SupportsProxy)
            {
                handler.Proxy = Proxy;
            }

            var client = new HttpClient(handler);

            var msg = await client.SendAsync(req).ConfigureAwait(false);

            await TwitterErrorHandler.ThrowIfErrorAsync(msg).ConfigureAwait(false);

            string response = await msg.Content.ReadAsStringAsync().ConfigureAwait(false);

            var responseJson = JsonDocument.Parse(response);

            BearerToken = responseJson.RootElement.GetProperty("access_token").GetString();
        }
        async Task <string> HandleResponseAsync(HttpResponseMessage msg)
        {
            LastUrl = msg.RequestMessage.RequestUri;

            ResponseHeaders =
                (from header in msg.Headers
                 select new
            {
                header.Key,
                Value = string.Join(", ", header.Value)
            })
                .ToDictionary(
                    pair => pair.Key,
                    pair => pair.Value);

            await TwitterErrorHandler.ThrowIfErrorAsync(msg).ConfigureAwait(false);

            return(await msg.Content.ReadAsStringAsync().ConfigureAwait(false));
        }
        internal async Task <string> HttpPostAsync(string oauthUrl, IDictionary <string, string> parameters)
        {
            var postData =
                (from keyValPair in parameters
                 where !keyValPair.Key.StartsWith("oauth")
                 select keyValPair)
                .ToDictionary(pair => pair.Key, pair => pair.Value);

            var req = new HttpRequestMessage(HttpMethod.Post, oauthUrl);

            req.Headers.Add("Authorization", GetAuthorizationString(HttpMethod.Post.ToString(), oauthUrl, parameters));
            req.Headers.Add("User-Agent", UserAgent);
            req.Headers.ExpectContinue = false;

            var paramString =
                string.Join("&",
                            (from parm in postData
                             select parm.Key + "=" + Url.PercentEncode(parm.Value))
                            .ToList());
            var content = new StringContent(paramString, Encoding.UTF8, "application/x-www-form-urlencoded");

            req.Content = content;

            var handler = new HttpClientHandler();

            if (handler.SupportsAutomaticDecompression)
            {
                handler.AutomaticDecompression = DecompressionMethods.GZip;
            }
            if (Proxy != null && handler.SupportsProxy)
            {
                handler.Proxy = Proxy;
            }

            var msg = await new HttpClient(handler).SendAsync(req).ConfigureAwait(false);

            await TwitterErrorHandler.ThrowIfErrorAsync(msg).ConfigureAwait(false);

            return(await msg.Content.ReadAsStringAsync().ConfigureAwait(false));
        }
        public async Task <string> QueryTwitterStreamAsync(Request request)
        {
            WriteLog(request.FullUrl, nameof(QueryTwitterStreamAsync));

            var handler = new HttpClientHandler();

            if (Authorizer.Proxy != null && handler.SupportsProxy)
            {
                handler.Proxy = Authorizer.Proxy;
            }

            StreamingClient = new HttpClient(handler)
            {
                Timeout = TimeSpan.FromMilliseconds(System.Threading.Timeout.Infinite)
            };

            var httpRequest = ConfigureRequest(request);

            var response = await StreamingClient.SendAsync(
                httpRequest, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);

            await TwitterErrorHandler.ThrowIfErrorAsync(response).ConfigureAwait(false);

            Stream stream = await CreateStream(response).ConfigureAwait(false);

            const int CarriageReturn = 0x0D;
            const int LineFeed       = 0x0A;

            var memStr = new MemoryStream();

            byte[] readByte;

            while (stream.CanRead && !IsStreamClosed)
            {
                readByte = new byte[1];
                await stream.ReadAsync(readByte, 0, 1, CancellationToken).ConfigureAwait(false);

                byte nextByte = readByte.SingleOrDefault();

                CancellationToken.ThrowIfCancellationRequested();

                if (IsStreamClosed)
                {
                    break;
                }

                if (nextByte == 0xff)
                {
                    break;
                }

                if (nextByte != CarriageReturn && nextByte != LineFeed)
                {
                    memStr.WriteByte(nextByte);
                }

                if (nextByte == LineFeed)
                {
                    int    byteCount  = (int)memStr.Length;
                    byte[] tweetBytes = new byte[byteCount];

                    memStr.Position = 0;
                    await memStr.ReadAsync(tweetBytes, 0, byteCount, CancellationToken).ConfigureAwait(false);

                    string tweet       = Encoding.UTF8.GetString(tweetBytes, 0, byteCount);
                    var    strmContent = new Streaming.StreamContent(this, tweet);

                    await StreamingCallbackAsync(strmContent).ConfigureAwait(false);

                    memStr.Dispose();
                    memStr = new MemoryStream();
                }
            }

            IsStreamClosed = false;

            return("{}");
        }