Esempio n. 1
0
        /// <summary>
        /// Starts the public stream.
        /// </summary>
        public IAsyncResult StartPublicStream(
            StreamStoppedCallback streamErrorCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            WebRequestBuilder builder;

            if (this.Tokens == null)
            {
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"), HTTPVerb.POST, true, this.UserAgent, this.NetworkCredentials);
            }
            else
            {
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"), HTTPVerb.POST, this.Tokens, true, this.UserAgent);
            }
            PrepareStreamOptions(builder);

            HttpWebRequest request = builder.PrepareRequest();

            this.streamStoppedCallback = streamErrorCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.eventCallback         = eventCallback;
            this.rawJsonCallback       = rawJsonCallback;
            this.stopReceived          = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#endif
            return(request.BeginGetResponse(StreamCallback, request));
        }
Esempio n. 2
0
        /// <summary>
        ///   Prepares the stream options.
        /// </summary>
        /// <param name = "builder">The builder.</param>
        private void PrepareStreamOptions(WebRequestBuilder builder)
        {
            if (StreamOptions != null)
            {
                if (StreamOptions.Count > 0)
                {
                    builder.Parameters.Add("count", StreamOptions.Count.ToString());
                }

                if (StreamOptions.Follow != null && StreamOptions.Follow.Count > 0)
                {
                    builder.Parameters.Add("follow", string.Join(",", StreamOptions.Follow.ToArray()));
                }

                if (StreamOptions.Locations != null && StreamOptions.Locations.Count > 0)
                {
                    builder.Parameters.Add("locations",
                                           string.Join(",",
                                                       StreamOptions.Locations.Select((x, r) => x.ToString()).ToArray()));
                }

                if (StreamOptions.Track != null && StreamOptions.Track.Count > 0)
                {
                    builder.Parameters.Add("track", string.Join(",", StreamOptions.Track.ToArray()));
                }

                builder.UseCompression = StreamOptions.UseCompression;
            }
        }
        /// <summary>
        /// Get the actual RateLimit for the UserTimeline
        /// </summary>
        /// <returns></returns>
        public RateLimit GetRateLimitForUserTimeline()
        {
            var tokens = new OAuthTokens
            {
                AccessToken       = _accessToken,
                AccessTokenSecret = _accessTokenSecret,
                ConsumerKey       = _consumerKey,
                ConsumerSecret    = _consumerSecret
            };

            string responseString = null;
            var    proxy          = new WebRequestBuilder(new Uri(RateLimitStatusesUrl), HTTPVerb.GET, tokens);

            using (var response = proxy.ExecuteRequest())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseString = reader.ReadToEnd();
                            reader.Close();
                        }
                    }
                }
            }

            var index = responseString.IndexOf("/statuses/user_timeline", System.StringComparison.Ordinal);

            if (index < 0)
            {
                return(null);
            }

            var result = new RateLimit();
            var value  = GetValue(responseString, index, "limit");

            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.Limit = int.Parse(value);

            value = GetValue(responseString, index, "remaining");
            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.LimitRemaining = int.Parse(value);

            value = GetValue(responseString, index, "reset");
            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }
            result.UtcLimitReset = ConvertFromUnixTimestamp(double.Parse(value));

            return(result);
        }
Esempio n. 4
0
        public void WhenIGetTheCreatedPost()
        {
            var createdPost = _scenarioContext.PostRapidApiResponse.ParseResponse <BlogPost>();
            var getRequest  = new WebRequestBuilder($"{ApiRootUrl}/blogPosts/{createdPost.id}")
                              .WithRequestMethod(HttpMethod.Get)
                              .Build();

            _scenarioContext.GetRapidApiResponse = ApiRequestProcessor.Call(getRequest);
        }
Esempio n. 5
0
        private void CreateNewBlogPost(Table table)
        {
            var blogPost = table.CreateInstance <BlogPost>();

            var createBlogPostRequest = new WebRequestBuilder($"{ApiRootUrl}/blogPosts")
                                        .WithRequestMethod(HttpMethod.Post)
                                        .WithRequestData(blogPost)
                                        .Build();

            _scenarioContext.PostRapidApiResponse = ApiRequestProcessor.Call(createBlogPostRequest);
        }
Esempio n. 6
0
        public override async Task <ResponseResult <TResponseParser> > Execute()
        {
            this.CheckSettings();

            if (this.webRequestBuilder == null)
            {
                this.webRequestBuilder = new EwsWebRequestBuilder();
            }

            string xml = this.Parameters.BuildXml(this.CommandName);

            return(await this.SendRequestAsync(xml, this.Settings.Username, this.Settings.Password));
        }
Esempio n. 7
0
        public void GivenIHaveAuthenticatedWithTheApplication()
        {
            var authEndpoint = "AUTH_ENDPOINT";
            var clientId     = "CLIENTID";
            var clientSecret = "CLIENT_SECRET";

            var url = $"{authEndpoint}?clientId={clientId}&clientSecret={clientSecret}";

            var webRequest = new WebRequestBuilder(url)
                             .Build();

            _scenarioContext.AuthResponse = ApiRequestProcessor.Call(webRequest);
        }
        /// <summary>
        /// See https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
        /// </summary>
        /// <param name="screenName">screen name</param>
        /// <param name="count">number of tweets to be retrieved</param>
        public List <UserTimelineResponse> GetUserTimeLine(string screenName, int count, out RateLimit rateLimit)
        {
            // Return results in a List of UserTimelineResponse
            List <UserTimelineResponse> result = null;

            // Define new OAuthTokens
            OAuthTokens tokens = new OAuthTokens
            {
                AccessToken       = _accessToken,
                AccessTokenSecret = _accessTokenSecret,
                ConsumerKey       = _consumerKey,
                ConsumerSecret    = _consumerSecret
            };

            // Concat a request string
            string url = UserTimelineUrl + "count=" + count + "&screen_name=" + screenName;

            // Use the WebRequest and WebResponse to execute request and retrieve the response
            WebRequestBuilder proxy = new WebRequestBuilder(new Uri(url), HTTPVerb.GET, tokens);

            // Execute the request
            using (HttpWebResponse response = proxy.ExecuteRequest())
            {
                string responseString = null;

                // Define our RateLimit (
                rateLimit                = new RateLimit();
                rateLimit.Limit          = int.Parse(response.Headers["X-Rate-Limit-Limit"]);
                rateLimit.LimitRemaining = int.Parse(response.Headers["X-Rate-Limit-Remaining"]);
                rateLimit.UtcLimitReset  = ConvertFromUnixTimestamp(double.Parse(response.Headers["X-Rate-Limit-Reset"]));

                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseString = reader.ReadToEnd();
                            reader.Close();
                        }
                    }
                }

                // JsonSerializer to get back a strongly typed object (UserTimelineResponse)
                JsonSerializer serializer = new JsonSerializer();
                result = (List <UserTimelineResponse>)serializer.Deserialize(new JsonTextReader(new StringReader(responseString)), typeof(List <UserTimelineResponse>));
            }

            return(result);
        }
        /// <summary>
        ///   Starts the user stream.
        /// </summary>
        public IAsyncResult StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/1.1/user.json"),
                                                              HTTPVerb.GET, Tokens, userAgent);

#if !SILVERLIGHT
            builder.Proxy = Proxy;
#endif
            PrepareStreamOptions(builder);

            if (StreamOptions != null && StreamOptions is UserStreamOptions)
            {
                if ((StreamOptions as UserStreamOptions).AllReplies)
                {
                    builder.Parameters.Add("replies", "all");
                }
            }

            request = builder.PrepareRequest();
            this.friendsCallback              = friendsCallback;
            this.streamStoppedCallback        = streamStoppedCallback;
            this.statusCreatedCallback        = statusCreatedCallback;
            this.statusDeletedCallback        = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback   = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            stopReceived         = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#else
            request.Timeout = 10000;
#endif
            return(request.BeginGetResponse(StreamCallback, request));
        }
Esempio n. 10
0
        internal static string ExecuteAuthenticatedWebRequest(string twitterQuery, OAuthTokens tokens, bool retry = true)
        {
            //get mentions
            string      responseText = string.Empty;
            WebResponse response;

            try
            {
                WebRequestBuilder requestBuilder = new WebRequestBuilder(new Uri(twitterQuery), HTTPVerb.GET, tokens);
                response = requestBuilder.ExecuteRequest();

                if (!Object.Equals(response, null))
                {
                    responseText = BuildTextFromResponse(response);

                    if (string.IsNullOrEmpty(responseText))
                    {
                        ExceptionExtensions.LogWarning(new ArgumentNullException("Twitter responseText from the httpwebresponse was empty"), "Twitter ExecuteAuthenticatedWebRequest", "Query: " + twitterQuery);
                    }
                }
                else
                {
                    ExceptionExtensions.LogWarning(new ArgumentNullException("Twitter httwebresponse object was null"), "Twitter ExecuteAuthenticatedWebRequest", "Query: " + twitterQuery);
                }
            }
            catch (Exception e)
            {
                if (retry)
                {
                    if (e.Message.Contains("429") || e.Message.Contains("420"))
                    {
                        ExceptionExtensions.LogWarning(e, "Twitter.Request.ExecuteAuthenticatedWebRequest");
                        Thread.Sleep(300000);                         //wait 5 min because of rate limiting
                    }
                    else
                    {
                        Thread.Sleep(60000);
                    }
                    ExecuteAuthenticatedWebRequest(twitterQuery, tokens, false);
                }
                else
                {
                    ExceptionExtensions.LogError(e, "Drone.API.Twitter.Request.ExecuteAuthenticatedWebRequest", twitterQuery);
                }
            }

            return(responseText);
        }
        /// <summary>
        ///   Starts the sample stream.
        /// </summary>
        public IAsyncResult StartSampleStream(
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder;

            if (Tokens == null)
            {
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/sample.json"),
                                                HTTPVerb.POST, userAgent, NetworkCredentials);
            }
            else
            {
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1.1/statuses/sample.json"),
                                                HTTPVerb.POST, Tokens, userAgent);
            }
#if !SILVERLIGHT
            builder.Proxy = Proxy;
#endif
            PrepareStreamOptions(builder);

            request = builder.PrepareRequest();

            this.streamStoppedCallback = streamStoppedCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.eventCallback         = eventCallback;
            this.rawJsonCallback       = rawJsonCallback;
            stopReceived = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#endif
            return(request.BeginGetResponse(StreamCallback, request));
        }
Esempio n. 12
0
        /// <summary>
        ///   Starts the user stream.
        /// </summary>
        public async void StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"),
                                                              HttpMethod.Get, Tokens, userAgent);

            PrepareStreamOptions(builder);

            if (StreamOptions != null && StreamOptions is UserStreamOptions)
            {
                if ((StreamOptions as UserStreamOptions).AllReplies)
                {
                    builder.Parameters.Add("replies", "all");
                }
            }

            request = await builder.PrepareRequestAsync();

            this.friendsCallback              = friendsCallback;
            this.streamStoppedCallback        = streamStoppedCallback;
            this.statusCreatedCallback        = statusCreatedCallback;
            this.statusDeletedCallback        = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback   = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            stopReceived         = false;
            //request.DefaultRequestHeaders.Timeout = 10000;
            return(client.GetAsync(request)); ..BeginGetResponse(StreamCallback, request);
Esempio n. 13
0
        /// <summary>
        /// Starts the user stream.
        /// </summary>
        public IAsyncResult  StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamErrorCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"), HTTPVerb.GET, this.Tokens, true, this.UserAgent);

            PrepareStreamOptions(builder);

            if (this.StreamOptions != null && this.StreamOptions is UserStreamOptions)
            {
                if ((this.StreamOptions as UserStreamOptions).AllReplies)
                {
                    builder.Parameters.Add("replies", "all");
                }
            }

            HttpWebRequest request = builder.PrepareRequest();

            this.friendsCallback              = friendsCallback;
            this.streamStoppedCallback        = streamErrorCallback;
            this.statusCreatedCallback        = statusCreatedCallback;
            this.statusDeletedCallback        = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback   = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            this.stopReceived    = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#endif
            return(request.BeginGetResponse(StreamCallback, request));
        }
Esempio n. 14
0
        public static void WebRequestBuilderParts()
        {
            WebRequestBuilder builder = new WebRequestBuilder(
                new Uri("http://example.com/endpoint"),
                HTTPVerb.GET,
                new OAuthTokens
            {
                ConsumerKey       = "key",
                ConsumerSecret    = "518F1B7B4C2F855EFF3DEFDAF1311",
                AccessToken       = "token",
                AccessTokenSecret = "A6FE4462BAA8C3ADEA7D9E3BCD5BB"
            }
                );

            // Manually add our values
            builder.Parameters.Add("oauth_version", "1.0");
            builder.Parameters.Add("oauth_nonce", "5565373");
            builder.Parameters.Add("oauth_timestamp", "1283303184");
            builder.Parameters.Add("oauth_signature_method", "HMAC-SHA1");
            builder.Parameters.Add("oauth_consumer_key", "49A8746B34B83CA13D1B9DACFD251");
            builder.Parameters.Add("oauth_consumer_secret", "518F1B7B4C2F855EFF3DEFDAF1311");
            builder.Parameters.Add("oauth_token", "8B163EC93574682CFF3FD6B45BD55");
            builder.Parameters.Add("oauth_token_secret", "A6FE4462BAA8C3ADEA7D9E3BCD5BB");

            string signature = builder.GenerateSignature();

            Assert.AreEqual(signature, "ndQStX289rIMyZR5dErSinLK/bQ=");

            builder.Parameters.Add("text", "this is a test http://example.com/test?key=value&key%202");
            signature = builder.GenerateSignature();
            Assert.AreEqual(signature, "MUUsZ/iV/FXxBRPdyxRkNKqEShw=");

            builder.Verb = HTTPVerb.POST;
            signature    = builder.GenerateSignature();
            Assert.AreEqual(signature, "wtbXMN5BwtH8r2/G/Rwqdp7HMnU=");
        }
Esempio n. 15
0
        /// <summary>
        ///   Starts the public stream.
        /// </summary>
        public IAsyncResult StartPublicStream(
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder;
            if (Tokens == null)
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"),
                                                HTTPVerb.POST, userAgent, NetworkCredentials);
            else
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"),
                                                HTTPVerb.POST, Tokens, userAgent);
            PrepareStreamOptions(builder);

            request = builder.PrepareRequest();

            this.streamStoppedCallback = streamStoppedCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.eventCallback = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            stopReceived = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#endif
            return request.BeginGetResponse(StreamCallback, request);
        }
Esempio n. 16
0
        /// <summary>
        ///   Starts the user stream.
        /// </summary>
        public IAsyncResult StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"),
                                                              HTTPVerb.GET, Tokens, userAgent);

            PrepareStreamOptions(builder);

            if (StreamOptions != null && StreamOptions is UserStreamOptions)
            {
                if ((StreamOptions as UserStreamOptions).AllReplies)
                    builder.Parameters.Add("replies", "all");
            }

            request = builder.PrepareRequest();
            this.friendsCallback = friendsCallback;
            this.streamStoppedCallback = streamStoppedCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            stopReceived = false;
#if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
#else
            request.Timeout = 10000;
#endif
            return request.BeginGetResponse(StreamCallback, request);
        }
Esempio n. 17
0
            public async Task <SystemNetHttpRequestResult> SendRequestAsync(string url, HttpMethod method, string contentType, string requestBody, byte[] requestBytes, Dictionary <string, string> headers, NetworkCredential credentials)
            {
                var filter = new HttpBaseProtocolFilter
                {
                    AutomaticDecompression = true,
                    AllowAutoRedirect      = true,
                    AllowUI = false
                };

                if (filter.IgnorableServerCertificateErrors != null)
                {
                    filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
                    filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);
                }

                // use this to make sure we don't have weird behavior where the app caches credentials for way too long
                // the real fix seems to be using a new API introduced in 14295 but that's not the version that is targeted today
                // see: http://stackoverflow.com/questions/30731424/how-to-stop-credential-caching-on-windows-web-http-httpclient
                filter.CookieUsageBehavior = HttpCookieUsageBehavior.NoCookies;

                if (credentials != null)
                {
                    filter.ServerCredential = new PasswordCredential("2Day", credentials.UserName, credentials.Password);
                }
                else
                {
                    filter.ServerCredential = null;
                }

                var client = new HttpClient(filter);

                if (headers != null)
                {
                    foreach (var header in headers)
                    {
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                }

                var request = new Windows.Web.Http.HttpRequestMessage(method.ToWindowsHttp(), SafeUri.Get(url));
                HttpRequestMessage systemNetRequest = request.ToSystemHttp();

                if (requestBody != null)
                {
                    if (method != HttpMethod.Post)
                    {
                        throw new NotSupportedException("Request body must use POST method");
                    }

                    var arrayContent = new HttpBufferContent(requestBytes.AsBuffer());

                    if (!string.IsNullOrWhiteSpace(contentType))
                    {
                        arrayContent.Headers.ContentType = new HttpMediaTypeHeaderValue(contentType);
                    }

                    if (method == HttpMethod.Post)
                    {
                        request.Content = arrayContent;
                    }
                }

                WebRequestBuilder.TraceRequest(systemNetRequest, requestBody);
                CancellationTokenSource timeoutCancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(30));

                Windows.Web.Http.HttpResponseMessage response = await client.SendRequestAsync(request).AsTask(timeoutCancellationToken.Token);

                client.Dispose();

                HttpResponseMessage systemNetResponse = await response.ToWindowsHttp(systemNetRequest);

                return(new SystemNetHttpRequestResult
                {
                    Request = systemNetRequest,
                    Response = systemNetResponse
                });
            }
Esempio n. 18
0
        public void ProcessRequest(HttpContext context)
        {
            StringBuilder log        = new StringBuilder();
            string        screenName = "";

            try
            {
                string query = "";

                UriBuilder urlBuilder = new UriBuilder("https://api.twitter.com/" + context.Server.UrlDecode(context.Request.QueryString["query"]));
                // Adds query strings to the url.
                // some headers may not be copied because they can't be used with clients other than twitter
                foreach (var queryString in context.Request.QueryString.AllKeys)
                {
                    switch (queryString)
                    {
                    case "u":
                    case "p":
                    case "query":
                    case "earned":
                    case "pc":
                        break;

                    default:
                        query += string.Format("&{0}={1}", queryString, context.Request.QueryString[queryString]);
                        break;
                    }
                }
                if (query.Length > 1)
                {
                    query = query.Substring(1);
                }
                urlBuilder.Query = query;
                log.AppendLine(query);
                log.AppendLine("URL: " + urlBuilder.Uri.ToString());
                OAuthTokens tokens = new OAuthTokens();
                tokens.ConsumerKey    = ConfigurationManager.AppSettings["TwitterConsumerKey"];
                tokens.ConsumerSecret = ConfigurationManager.AppSettings["TwitterConsumerSecret"];

                JToken accessToken;
                String userFileName = context.Server.MapPath("/App_Data/Users/" + context.Request.QueryString["u"] + "." + context.Request.QueryString["p"]);
                if (File.Exists(userFileName))
                {
                    using (StreamReader str = new StreamReader(userFileName))
                    {
                        accessToken = JObject.Parse(str.ReadToEnd());
                        ;
                    }
                    tokens.AccessToken       = (string)accessToken.SelectToken("AccessToken");
                    tokens.AccessTokenSecret = (string)accessToken.SelectToken("AccessSecret");
                    screenName = (string)accessToken.SelectToken("ScreenName");
                    log.AppendLine("User FOUND!");
                }
                else
                {
                    log.AppendLine("User NOT FOUND");
                    context.Response.StatusCode = 404;
                    return;
                }
                //check if the request is xAuth, if it is, simulates the xAuth result for fooling Twitter for iPhone.
                if (context.Request.QueryString["query"].Contains("oauth/access_token"))
                {
                    string xAuthResponse = string.Format("oauth_token={0}&oauth_token_secret={1}&user_id={2}&screen_name={3}&x_auth_expires=0",
                                                         (string)accessToken.SelectToken("AccessToken"),
                                                         (string)accessToken.SelectToken("AccessSecret"),
                                                         (string)accessToken.SelectToken("UserId"),
                                                         (string)accessToken.SelectToken("ScreenName"));
                    context.Response.Write(xAuthResponse);
                    screenName = (string)accessToken.SelectToken("ScreenName");
                    return;
                }

                HTTPVerb verb = HTTPVerb.GET;
                switch (context.Request.HttpMethod)
                {
                case "GET":
                    verb = HTTPVerb.GET;
                    break;

                case "POST":
                    verb = HTTPVerb.POST;
                    break;

                case "DELETE":
                    verb = HTTPVerb.DELETE;
                    break;
                }
                if (context.Request.Headers["Authorization"] == null)
                {
                    tokens = null;
                    log.AppendLine("Request NOT authenticated");
                }
                WebRequestBuilder webreq = new WebRequestBuilder(urlBuilder.Uri, verb, tokens);
                webreq.Multipart = (context.Request.ContentType.Contains("multipart"));
                if (verb != HTTPVerb.GET)
                {
                    // adds body parameters to request
                    foreach (var key in context.Request.Form.AllKeys)
                    {
                        webreq.Parameters.Add(key, context.Request.Form[key]);
                    }
                    foreach (var fileKey in context.Request.Files.AllKeys)
                    {
                        webreq.Parameters.Add(fileKey, context.Request.Form[fileKey]);
                    }
                }
                ServicePointManager.Expect100Continue = false;
                HttpWebRequest req = webreq.PrepareRequest();
                try
                {
                    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                    log.AppendLine("get Response");
                    StreamReader strReader = new StreamReader(resp.GetResponseStream());
                    String       response  = strReader.ReadToEnd();
                    if (ConfigurationManager.AppSettings["debugMode"] == "true")
                    {
                        log.AppendLine(response);
                    }
                    // replaces images url to use TwiX to load them
                    response = Regex.Replace(response, @"(((http:\\/\\/www)|(http:\\/\\/)|(https:\\/\\/www)|(https:\\/\\/)|(www))[-a-zA-Z0-9@:%_\\\+.~#?&//=]+)\.(jpg|jpeg|gif|png|bmp|tiff|tga|svg)", delegate(Match match)
                    {
                        string v = match.ToString();
                        return(ConfigurationManager.AppSettings["baseUrl"] + "image/" + shFunctions.encryptBase64Url(DES.Encrypt(v.Replace(@"\/", "/").Replace("_normal", ""), shFunctions.key) + ".jpg"));
                    });

                    strReader.Close();
                    context.Response.ClearContent();
                    context.Response.Write(response);
                }
                catch (WebException webex)
                {
                    if (webex.Status == WebExceptionStatus.ProtocolError)
                    {
                        context.Response.StatusCode = (int)((HttpWebResponse)webex.Response).StatusCode;
                    }
                    log.AppendLine("ERROR: " + webex.Message);
                    return;
                }
            }
            catch (Exception ee) {
                log.AppendLine("Error: " + ee.Message);
                log.AppendLine("stack: " + ee.StackTrace);
            }

            if (ConfigurationManager.AppSettings["log"] == "true")
            {
                writeLogToFile(log.ToString(), screenName, context.Request.HttpMethod, context);
            }
            //throw new Exception(context.Request.QueryString.ToString());
        }
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <returns>The results of the command.</returns>
        public async Task <TwitterResponse <T> > ExecuteCommand()
        {
            TwitterResponse <T> twitterResponse = new TwitterResponse <T>();

            if (this.OptionalProperties.UseSSL)
            {
                this.Uri = new Uri(this.Uri.AbsoluteUri.Replace("http://", "https://"));
            }

            // Loop through all of the custom attributes assigned to the command class
            foreach (CustomAttributeData attribute in System.Reflection.IntrospectionExtensions.GetTypeInfo(this.GetType()).CustomAttributes)
            {
                if (attribute.AttributeType == typeof(AuthorizedCommandAttribute))
                {
                    if (this.Tokens == null)
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Tokens are required for the \"{0}\" command.", this.GetType()));
                    }

                    if (string.IsNullOrEmpty(this.Tokens.ConsumerKey) ||
                        string.IsNullOrEmpty(this.Tokens.ConsumerSecret) ||
                        string.IsNullOrEmpty(this.Tokens.AccessToken) ||
                        string.IsNullOrEmpty(this.Tokens.AccessTokenSecret))
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Token values cannot be null when executing the \"{0}\" command.", this.GetType()));
                    }
                }
                else if (attribute.AttributeType == typeof(RateLimitedAttribute))
                {
                    //Get the rate limiting status
                    if ((await Account.RateLimitStatusAsync(this.Tokens)).ResponseObject.RemainingHits == 0)
                    {
                        throw new TwitterizerException("You are being rate limited.");
                    }
                }
            }

            // Prepare the query parameters
            Dictionary <string, object> queryParameters = new Dictionary <string, object>();

            foreach (KeyValuePair <string, object> item in this.RequestParameters)
            {
                queryParameters.Add(item.Key, item.Value);
            }

            // Declare the variable to be returned
            twitterResponse.ResponseObject = default(T);
            twitterResponse.RequestUrl     = this.Uri.AbsoluteUri;
            RateLimiting        rateLimiting = null;
            AccessLevel         accessLevel;
            string              responseData = null;
            HttpResponseMessage response     = null;

            try
            {
                WebRequestBuilder requestBuilder = new WebRequestBuilder(this.Uri, this.Verb, this.Tokens)
                {
                    Multipart = this.Multipart
                };

                foreach (var item in queryParameters)
                {
                    requestBuilder.Parameters.Add(item.Key, item.Value);
                }

                try
                {
                    response = await requestBuilder.ExecuteRequestAsync();
                }
                catch
                {
                    ;
                }

                if (response == null)
                {
                    twitterResponse.Result = RequestResult.Unknown;
                    return(twitterResponse);
                }

                responseData = await response.Content.ReadAsStringAsync(); // ConversionUtility.ReadStream(await response.Content.ReadAsStreamAsync());

                twitterResponse.Content = responseData;                    // Encoding.UTF8.GetString(responseData, 0, responseData.Length);

                twitterResponse.RequestUrl = requestBuilder.RequestUri.AbsoluteUri;

                // Parse the rate limiting HTTP Headers
                rateLimiting = ParseRateLimitHeaders(response.Headers);

                // Parse Access Level
                accessLevel = ParseAccessLevel(response.Headers);

                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, response.StatusCode, rateLimiting);

                twitterResponse.RateLimiting = rateLimiting;
                twitterResponse.AccessLevel  = accessLevel;

                response.EnsureSuccessStatusCode();
            }
            catch (HttpRequestException wex)
            {
                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, response.StatusCode, rateLimiting);

                twitterResponse.ErrorMessage = wex.Message;

                // Try to read the error message, if there is one.
                try
                {
                    TwitterErrorDetails errorDetails = SerializationHelper <TwitterErrorDetails> .Deserialize(responseData);

                    twitterResponse.ErrorMessage = errorDetails.ErrorMessage;
                }
                catch (Exception)
                {
                    // Occasionally, Twitter responds with XML error data even though we asked for json.
                    // This is that scenario. We will deal with it by doing nothing. It's up to the developer to deal with it.
                }

                return(twitterResponse);
            }

            try
            {
                twitterResponse.ResponseObject = SerializationHelper <T> .Deserialize(responseData, this.DeserializationHandler);
            }
            catch (Newtonsoft.Json.JsonReaderException)
            {
                twitterResponse.ErrorMessage = "Unable to parse JSON";
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }
            catch (Newtonsoft.Json.JsonSerializationException jse)
            {
                twitterResponse.ErrorMessage = String.Format("Unable to parse JSON: {0}", jse.Message);
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }

            // Pass the current oauth tokens into the new object, so method calls from there will keep the authentication.
            twitterResponse.Tokens = this.Tokens;

            return(twitterResponse);
        }
        public void SetUp()
        {
            sys = new Mock <Sys>();

            sut = new WebRequestBuilder(sys.Object, "{key}/{pid}");
        }
Esempio n. 21
0
        private List <TwitterEntity> GetLatestTweets(string handle)
        {
            List <TwitterEntity> tweets = new List <TwitterEntity>();

            #region Twitter Library Setup
            OAuthTokens oaccesstkn     = new OAuthTokens();
            string      consumerKey    = ConfigurationManager.AppSettings["TwitterConsumerKey"];
            string      consumerSecret = ConfigurationManager.AppSettings["TwitterConsumerSecret"];

            oaccesstkn.AccessToken       = ConfigurationManager.AppSettings["TwitterAccessToken"];
            oaccesstkn.AccessTokenSecret = ConfigurationManager.AppSettings["TwitterAccessSecret"];;
            oaccesstkn.ConsumerKey       = consumerKey;
            oaccesstkn.ConsumerSecret    = consumerSecret;
            #endregion

            try
            {
                #region Get Tweets From Twitter
                WebRequestBuilder webRequest = new WebRequestBuilder(new Uri(string.Format(ConfigurationManager.AppSettings["TwitterUrl"], handle, 500)), HTTPVerb.GET, oaccesstkn);

                string responseText;
                using (var response = webRequest.ExecuteRequest())
                {
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        responseText = reader.ReadToEnd();
                    }
                }

                var brr = Encoding.UTF8.GetBytes(responseText);

                var streamReader = new StreamReader(new MemoryStream(brr));

                var serializer = new DataContractJsonSerializer(typeof(SearchResults));

                var tweetsResponse = (SearchResults)serializer.ReadObject(streamReader.BaseStream);

                streamReader.Close();
                #endregion

                foreach (var mmTweetData in tweetsResponse.Results)
                {
                    var tweetId = mmTweetData.Id.ToString();
                    try
                    {
                        var myTweet = new TwitterEntity
                        {
                            RowKey                = Guid.NewGuid().ToString(),
                            TwitterId             = tweetId,
                            TwitterIdString       = mmTweetData.Id_Str,
                            TextMessage           = mmTweetData.Text,
                            Source                = mmTweetData.Source,
                            FromUser              = mmTweetData.Source,
                            FromUserId            = mmTweetData.ToUserName,
                            ProfileImageUrl       = mmTweetData.User.ProfileImageUrl,
                            ProfileSecureImageUrl = mmTweetData.User.ProfileImageUrlHttps,
                            ReplyUserId           = mmTweetData.User.FromUserId.ToString(),
                            ReplyScreenName       = mmTweetData.User.FromUser,
                            ResultType            = mmTweetData.SearchMetaData.ResultType,
                            LanguageCode          = mmTweetData.SearchMetaData.IsoLanguageCode,
                            Created_At            = ParseTwitterDateTime(mmTweetData.CreatedAt),
                            Status                = "-1"
                        };

                        tweets.Add(myTweet);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            catch (Exception)
            {
            }

            return(tweets);
        }
Esempio n. 22
0
        /// <summary>
        /// Starts the stream.
        /// </summary>
        private void StartStream(string streamUri)
        {
            WebRequestBuilder builder = new WebRequestBuilder(new Uri(streamUri), HTTPVerb.GET, this.Tokens);

            HttpWebRequest request;
            request = builder.PrepareRequest();
            request.UserAgent = userAgent;

            request.BeginGetResponse(
                ar =>
                {
                    var req = (WebRequest)ar.AsyncState;

                    // TODO: Add exception handling: EndGetResponse could throw
                    using (var response = req.EndGetResponse(ar))
                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        // This loop goes as long as twitter is streaming
                        while (!reader.EndOfStream)
                        {
                            // If the calling application has asked to halt the connection, this will abort the connection.
                            if (this.stopReceived)
                            {
                                req.Abort();
                                OnStreamingStopped(StopReasons.StoppedByRequest, "Stop request received");
                                return;
                            }

                            try
                            {
                                TwitterStatus resultObject = Twitterizer.Core.SerializationHelper<TwitterStatus>.Deserialize(
                                    Encoding.UTF8.GetBytes(reader.ReadLine()));


                                if (resultObject != null && resultObject.Id > 0 && this.OnStatusReceived != null)
                                {
                                    this.OnStatusReceived(resultObject);
                                }
                            }
                            catch (System.Runtime.Serialization.SerializationException)
                            {
                            }
                        }
                    }
                },
                request);
        }
Esempio n. 23
0
        /// <summary>
        /// Starts the public stream.
        /// </summary>
        public IAsyncResult StartPublicStream(            
            StreamStoppedCallback streamErrorCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            WebRequestBuilder builder;
            if (this.Tokens == null)
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"), HTTPVerb.POST, true, this.UserAgent, this.NetworkCredentials);
            else
                builder = new WebRequestBuilder(new Uri("https://stream.twitter.com/1/statuses/filter.json"), HTTPVerb.POST, this.Tokens, true, this.UserAgent);
            PrepareStreamOptions(builder);

            HttpWebRequest request = builder.PrepareRequest();

            this.streamStoppedCallback = streamErrorCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.eventCallback = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            this.stopReceived = false;
            #if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
            #endif
            return request.BeginGetResponse(StreamCallback, request);
        }
Esempio n. 24
0
        /// <summary>
        ///   Starts the user stream.
        /// </summary>
        public async void StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamStoppedCallback,
            StatusCreatedCallback statusCreatedCallback,
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            if (request != null)
            {
                throw new InvalidOperationException("Stream is already open");
            }

            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"),
                                                              HttpMethod.Get, Tokens, userAgent);

            PrepareStreamOptions(builder);

            if (StreamOptions != null && StreamOptions is UserStreamOptions)
            {
                if ((StreamOptions as UserStreamOptions).AllReplies)
                    builder.Parameters.Add("replies", "all");
            }

            request = await builder.PrepareRequestAsync();
            this.friendsCallback = friendsCallback;
            this.streamStoppedCallback = streamStoppedCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            stopReceived = false;
            //request.DefaultRequestHeaders.Timeout = 10000;
            return client.GetAsync(request);..BeginGetResponse(StreamCallback, request);
            return null;
        }
Esempio n. 25
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="overrideVerb"></param>
        /// <returns></returns>
        protected virtual TwitterResponse<string> ExecuteRequest(HTTPVerb overrideVerb)
        {
            this.Verb = overrideVerb;
            if (String.IsNullOrEmpty(this.Method))
                throw new ArgumentNullException("Method");

            WebRequestBuilder builder = new WebRequestBuilder(
                new Uri(this.BaseUri + this.Method),
                this.Verb,
                this.Tokens);

            string responseBody = String.Empty;

            try
            {
                if (this.AdditionalParameters.Count > 0)
                {
                    foreach (var item in this.AdditionalParameters)
                        builder.Parameters.Add(item.Key, item.Value);
                    if(this.Verb==HTTPVerb.POST)
                        builder.Multipart = true;
                }

                HttpWebResponse webResponse = builder.ExecuteRequest();
                Stream responseStream = webResponse.GetResponseStream();
                if (responseStream != null) responseBody = new StreamReader(responseStream).ReadToEnd();
            }
            catch (WebException wex)
            {
                TwitterStatus status = TwitterStatus.GeneralError; ;
                if (wex.Status == WebExceptionStatus.ProtocolError)
                {
                    switch(((HttpWebResponse)wex.Response).StatusCode)
                    {
                        case HttpStatusCode.BadRequest:
                            status = TwitterStatus.BadRequest;
                            break;

                        case HttpStatusCode.Unauthorized:
                            status = TwitterStatus.Unauthorized;
                            break;

                        case HttpStatusCode.NotFound:
                            status = TwitterStatus.FileNotFound;
                            break;
                        case HttpStatusCode.NotAcceptable:
                            status = TwitterStatus.NotAcceptable;
                            break;
                        default:
                            status = TwitterStatus.GeneralError;
                            break;
                    }
                }
                return new TwitterResponse<string>()
                {
                    Status = status,
                    ObjectResponse = String.Empty
                };
            }

            return new TwitterResponse<string>()
            {
                Status = TwitterStatus.Success,
                ObjectResponse = responseBody
            };
        }
Esempio n. 26
0
        /// <summary>
        /// Prepares the stream options.
        /// </summary>
        /// <param name="builder">The builder.</param>
        private void PrepareStreamOptions(WebRequestBuilder builder)
        {
            if (this.StreamOptions != null)
            {
                if (this.StreamOptions.Count > 0)
                    builder.Parameters.Add("count", this.StreamOptions.Count.ToString());

                if (this.StreamOptions.Follow != null && this.StreamOptions.Follow.Count > 0)
                    builder.Parameters.Add("follow", string.Join(",", this.StreamOptions.Follow.ToArray()));

                if (this.StreamOptions.Locations != null && this.StreamOptions.Locations.Count > 0)
                    builder.Parameters.Add("locations", string.Join(",", this.StreamOptions.Locations.Select((x, r) => x.ToString()).ToArray()));

                if (this.StreamOptions.Track != null && this.StreamOptions.Track.Count > 0)
                    builder.Parameters.Add("track", string.Join(",", this.StreamOptions.Track.ToArray()));
            }
        }
Esempio n. 27
0
        /// <summary>
        ///   Prepares the stream options.
        /// </summary>
        /// <param name = "builder">The builder.</param>
        private void PrepareStreamOptions(WebRequestBuilder builder)
        {
            if (StreamOptions != null)
            {
                if (StreamOptions.Count > 0)
                    builder.Parameters.Add("count", StreamOptions.Count.ToString());

                if (StreamOptions.Follow != null && StreamOptions.Follow.Count > 0)
                    builder.Parameters.Add("follow", string.Join(",", StreamOptions.Follow.ToArray()));

                if (StreamOptions.Locations != null && StreamOptions.Locations.Count > 0)
                    builder.Parameters.Add("locations",
                                           string.Join(",",
                                                       StreamOptions.Locations.Select((x, r) => x.ToString()).ToArray()));

                if (StreamOptions.Track != null && StreamOptions.Track.Count > 0)
                    builder.Parameters.Add("track", string.Join(",", StreamOptions.Track.ToArray()));

                builder.UseCompression = StreamOptions.UseCompression;
                
#if !SILVERLIGHT        

            if (this.StreamOptions != null)
                builder.Proxy = this.StreamOptions.Proxy;
#endif
            }
        }
Esempio n. 28
0
        /// <summary>
        /// Starts the user stream.
        /// </summary>
        public IAsyncResult StartUserStream(
            InitUserStreamCallback friendsCallback,
            StreamStoppedCallback streamErrorCallback,
            StatusCreatedCallback statusCreatedCallback, 
            StatusDeletedCallback statusDeletedCallback,
            DirectMessageCreatedCallback directMessageCreatedCallback,
            DirectMessageDeletedCallback directMessageDeletedCallback,
            EventCallback eventCallback,
            RawJsonCallback rawJsonCallback = null
            )
        {
            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"), HTTPVerb.GET, this.Tokens, true, this.UserAgent);

            PrepareStreamOptions(builder);

            if (this.StreamOptions != null && this.StreamOptions is UserStreamOptions)
            {
                if ((this.StreamOptions as UserStreamOptions).AllReplies)
                    builder.Parameters.Add("replies", "all");
            }

            HttpWebRequest request = builder.PrepareRequest();

            this.friendsCallback = friendsCallback;
            this.streamStoppedCallback = streamErrorCallback;
            this.statusCreatedCallback = statusCreatedCallback;
            this.statusDeletedCallback = statusDeletedCallback;
            this.directMessageCreatedCallback = directMessageCreatedCallback;
            this.directMessageDeletedCallback = directMessageDeletedCallback;
            this.eventCallback = eventCallback;
            this.rawJsonCallback = rawJsonCallback;
            this.stopReceived = false;
            #if SILVERLIGHT
            request.AllowReadStreamBuffering = false;
            #endif
            return request.BeginGetResponse(StreamCallback, request);
        }
Esempio n. 29
0
        /// <summary>
        /// Starts the user stream.
        /// </summary>
        public void StartUserStream()
        {
            WebRequestBuilder builder = new WebRequestBuilder(new Uri("https://userstream.twitter.com/2/user.json"), HTTPVerb.GET, this.Tokens);

            HttpWebRequest request = builder.PrepareRequest();
            request.KeepAlive = true;
            //request.UserAgent = userAgent;

            request.BeginGetResponse(StreamCallback, request);
        }
Esempio n. 30
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <returns>The results of the command.</returns>
        public TwitterResponse <T> ExecuteCommand()
        {
            TwitterResponse <T> twitterResponse = new TwitterResponse <T>();

            if (this.OptionalProperties.UseSSL)
            {
                this.Uri = new Uri(this.Uri.AbsoluteUri.Replace("http://", "https://"));
            }

            // Loop through all of the custom attributes assigned to the command class
            foreach (Attribute attribute in this.GetType().GetCustomAttributes(false))
            {
                if (attribute is AuthorizedCommandAttribute)
                {
                    if (this.Tokens == null)
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Tokens are required for the \"{0}\" command.", this.GetType()));
                    }

                    if (string.IsNullOrEmpty(this.Tokens.ConsumerKey) ||
                        string.IsNullOrEmpty(this.Tokens.ConsumerSecret) ||
                        string.IsNullOrEmpty(this.Tokens.AccessToken) ||
                        string.IsNullOrEmpty(this.Tokens.AccessTokenSecret))
                    {
                        throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "Token values cannot be null when executing the \"{0}\" command.", this.GetType()));
                    }
                }
                else if (attribute is RateLimitedAttribute)
                {
                    // Get the rate limiting status
                    if (TwitterRateLimitStatus.GetStatus(this.Tokens).ResponseObject.RemainingHits == 0)
                    {
                        throw new TwitterizerException("You are being rate limited.");
                    }
                }
            }

            // Prepare the query parameters
            Dictionary <string, object> queryParameters = new Dictionary <string, object>();

            foreach (KeyValuePair <string, object> item in this.RequestParameters)
            {
                queryParameters.Add(item.Key, item.Value);
            }

            // Declare the variable to be returned
            twitterResponse.ResponseObject = default(T);
            twitterResponse.RequestUrl     = this.Uri.AbsoluteUri;
            RateLimiting rateLimiting;
            AccessLevel  accessLevel;

            byte[] responseData;

            try
            {
                WebRequestBuilder requestBuilder = new WebRequestBuilder(this.Uri, this.Verb, this.Tokens)
                {
                    Multipart = this.Multipart
                };

#if !SILVERLIGHT
                if (this.OptionalProperties != null)
                {
                    requestBuilder.Proxy = this.OptionalProperties.Proxy;
                }
#endif

                foreach (var item in queryParameters)
                {
                    requestBuilder.Parameters.Add(item.Key, item.Value);
                }

                HttpWebResponse response = requestBuilder.ExecuteRequest();

                if (response == null)
                {
                    twitterResponse.Result = RequestResult.Unknown;
                    return(twitterResponse);
                }

                responseData            = ConversionUtility.ReadStream(response.GetResponseStream());
                twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length);

                twitterResponse.RequestUrl = requestBuilder.RequestUri.AbsoluteUri;

#if !SILVERLIGHT
                // Parse the rate limiting HTTP Headers
                rateLimiting = ParseRateLimitHeaders(response.Headers);

                // Parse Access Level
                accessLevel = ParseAccessLevel(response.Headers);
#else
                rateLimiting = null;
                accessLevel  = AccessLevel.Unknown;
#endif

                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, response.StatusCode, rateLimiting);

                twitterResponse.RateLimiting = rateLimiting;
                twitterResponse.AccessLevel  = accessLevel;
            }
            catch (WebException wex)
            {
                if (new[]
                {
#if !SILVERLIGHT
                    WebExceptionStatus.Timeout,
                    WebExceptionStatus.ConnectionClosed,
#endif
                    WebExceptionStatus.ConnectFailure
                }.Contains(wex.Status))
                {
                    twitterResponse.Result       = RequestResult.ConnectionFailure;
                    twitterResponse.ErrorMessage = wex.Message;
                    return(twitterResponse);
                }

                // The exception response should always be an HttpWebResponse, but we check for good measure.
                HttpWebResponse exceptionResponse = wex.Response as HttpWebResponse;

                if (exceptionResponse == null)
                {
                    throw;
                }

                responseData            = ConversionUtility.ReadStream(exceptionResponse.GetResponseStream());
                twitterResponse.Content = Encoding.UTF8.GetString(responseData, 0, responseData.Length);

#if !SILVERLIGHT
                rateLimiting = ParseRateLimitHeaders(exceptionResponse.Headers);

                // Parse Access Level
                accessLevel = ParseAccessLevel(exceptionResponse.Headers);
#else
                rateLimiting = null;
                accessLevel  = AccessLevel.Unknown;
#endif

                // Try to read the error message, if there is one.
                try
                {
                    TwitterErrorDetails errorDetails = SerializationHelper <TwitterErrorDetails> .Deserialize(responseData);

                    twitterResponse.ErrorMessage = errorDetails.ErrorMessage;
                }
                catch (Exception)
                {
                    // Occasionally, Twitter responds with XML error data even though we asked for json.
                    // This is that scenario. We will deal with it by doing nothing. It's up to the developer to deal with it.
                }

                // Lookup the status code and set the status accordingly
                SetStatusCode(twitterResponse, exceptionResponse.StatusCode, rateLimiting);

                twitterResponse.RateLimiting = rateLimiting;
                twitterResponse.AccessLevel  = accessLevel;

                if (wex.Status == WebExceptionStatus.UnknownError)
                {
                    throw;
                }

                return(twitterResponse);
            }

            try
            {
                twitterResponse.ResponseObject = SerializationHelper <T> .Deserialize(responseData, this.DeserializationHandler);
            }
            catch (Newtonsoft.Json.JsonReaderException)
            {
                twitterResponse.ErrorMessage = "Unable to parse JSON";
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }
            catch (Newtonsoft.Json.JsonSerializationException)
            {
                twitterResponse.ErrorMessage = "Unable to parse JSON";
                twitterResponse.Result       = RequestResult.Unknown;
                return(twitterResponse);
            }

            // Pass the current oauth tokens into the new object, so method calls from there will keep the authentication.
            twitterResponse.Tokens = this.Tokens;

            return(twitterResponse);
        }
Esempio n. 31
0
 protected EwsCommandBase(EwsRequestParameter <TRequestBuilder> parameters, WebRequestBuilder webRequestBuilder)
     : base(parameters)
 {
     this.webRequestBuilder = webRequestBuilder;
 }