protected override WebRequest BuildPostOrPutWebRequest(PostOrPut method, string url, out byte[] content)
        {
            url = AppendParameters(url);

            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = method == PostOrPut.Post ? "POST" : "PUT";
            request.ContentType = "application/x-www-form-urlencoded";

#if !SILVERLIGHT
            if (!Proxy.IsNullOrBlank())
            {
                SetWebProxy(request);
            }
#endif
            if (!UserAgent.IsNullOrBlank())
            {
#if !SILVERLIGHT
                request.UserAgent = UserAgent;
#else
                request.Headers["X-Twitter-Agent"] = UserAgent;
#endif
            }

            if (UseCompression)
            {
#if !SILVERLIGHT
                request.AutomaticDecompression = DecompressionMethods.GZip;
#else
                request.Headers["X-Twitter-Accept"] = "gzip,deflate";
#endif
            }
#if !SILVERLIGHT
            if (RequestTimeout.HasValue)
            {
                request.Timeout = (int) RequestTimeout.Value.TotalMilliseconds;
            }

            if (KeepAlive)
            {
                // Keep-Alive should be the default in Silverlight as-is
                request.KeepAlive = KeepAlive;
                if (RequestTimeout.HasValue)
                {
                    request.ReadWriteTimeout = (int)RequestTimeout.Value.TotalMilliseconds;
                }
            }
#endif
            SetAuthorizationHeader(request, "Authorization");
            //AppendHeaders(request);
            //request.Credentials = 

#if !SILVERLIGHT
            content = Encoding.ASCII.GetBytes(url);
            request.ContentLength = content.Length;
#else
            content = Encoding.UTF8.GetBytes(url);
#endif

            return request;
        }
示例#2
0
        protected virtual WebQueryAsyncResult ExecutePostOrPutAsync(PostOrPut method, 
                                                                    string url, 
                                                                    string prefixKey,
                                                                    ICache cache, 
                                                                    TimeSpan slidingExpiration,
                                                                    object userState)
        {
            WebResponse = null;

            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var state = new Triplet<WebRequest, Pair<byte[], Triplet<ICache, TimeSpan, string>>, object>
                            {
                                First = request,
                                Second = new Pair<byte[], Triplet<ICache, TimeSpan, string>>
                                             {
                                                 First = content,
                                                 Second = new Triplet<ICache, TimeSpan, string>
                                                              {
                                                                  First = cache,
                                                                  Second = slidingExpiration,
                                                                  Third = prefixKey
                                                              }
                                             },
                                Third = userState
                            };

            var args = new WebQueryRequestEventArgs(url);
            OnQueryRequest(args);

            var inner = request.BeginGetRequestStream(PostAsyncRequestCallback, state);
            var result = new WebQueryAsyncResult { InnerResult = inner };
            RegisterAbortTimer(request, result);
            return result;
        }
示例#3
0
        protected virtual WebQueryAsyncResult ExecutePostOrPutAsync(PostOrPut method,
                                                                    string url,
                                                                    IEnumerable<HttpPostParameter> parameters,
                                                                    object userState)
        {
            WebResponse = null;

            string boundary;
            var request = BuildMultiPartFormRequest(method, url, parameters, out boundary);

            var state = new Triplet<WebRequest, Pair<string, IEnumerable<HttpPostParameter>>, object>
                            {
                                First = request,
                                Second = new Pair<string, IEnumerable<HttpPostParameter>>
                                             {
                                                 First = boundary,
                                                 Second = parameters
                                             },
                                Third = userState
                            };
            var args = new WebQueryRequestEventArgs(url);

            OnQueryRequest(args);
            
            var inner = request.BeginGetRequestStream(PostAsyncRequestCallbackMultiPart, state);
            var result = new WebQueryAsyncResult { InnerResult = inner };
            RegisterAbortTimer(request, result);
            return result;
        }
示例#4
0
        protected virtual WebQueryAsyncResult ExecutePostOrPutAsync(PostOrPut method, string url, object userState)
        {
            WebResponse = null;

            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var state = new Triplet<WebRequest, byte[], object>
                            {
                                First = request,
                                Second = content,
                                Third = userState
                            };

            var args = new WebQueryRequestEventArgs(url);
            OnQueryRequest(args);

            var inner = request.BeginGetRequestStream(PostAsyncRequestCallback, state);
            var result = new WebQueryAsyncResult { InnerResult = inner };
            RegisterAbortTimer(request, result);
            return result;
        }
        // todo duplicated in OAuthWebQueryClient, consolidate
        protected override WebRequest BuildPostOrPutWebRequest(PostOrPut method, string url, out byte[] content)
        {
            // remove POST parameters from query
            var uri = url.AsUri();
            url = uri.Scheme.Then("://")
#if !SILVERLIGHT
                .Then(uri.Authority)
#else
                .Then(uri.Host)
#endif
                ;

            if (uri.Port != 80)
            {
                url = url.Then(":" + uri.Port);
            }
            url = url.Then(uri.AbsolutePath);

            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = method == PostOrPut.Post ? "POST" : "PUT";
            request.ContentType = "application/x-www-form-urlencoded";

#if !SILVERLIGHT
            if (!Proxy.IsNullOrBlank())
            {
                SetWebProxy(request);
            }
#endif
            foreach (var header in Headers)
            {
#if !SILVERLIGHT
                request.Headers.Add(header.Key, header.Value);
#else
                request.Headers[header.Key] = header.Value;
#endif
            }

            if (!UserAgent.IsNullOrBlank())
            {
#if !SILVERLIGHT
                request.UserAgent = UserAgent;
#else
                request.Headers["User-Agent"] = UserAgent;
#endif
            }

            if (UseCompression)
            {
#if !SILVERLIGHT
                request.AutomaticDecompression = DecompressionMethods.GZip;
#else
                request.Accept = "gzip,deflate";
#endif
            }
#if !SILVERLIGHT
            if (RequestTimeout.HasValue)
            {
                request.Timeout = (int)RequestTimeout.Value.TotalMilliseconds;
            }

            if (KeepAlive)
            {
                request.KeepAlive = true;
            }
#endif
            var body = "";
            switch (ParameterHandling)
            {
                case OAuthParameterHandling.HttpAuthorizationHeader:
                    SetAuthorizationHeader(request, "Authorization");
                    break;
                case OAuthParameterHandling.UrlOrPostParameters:
                    body = GetPostParametersValue(Parameters, false);
                    break;
            }

            // Only use the POST parameters that exist in the body
#if SILVERLIGHT
            var postParameters = new WebParameterCollection(uri.Query.ParseQueryString());
#else
            var postParameters = new WebParameterCollection(HttpUtility.ParseQueryString(uri.Query));
#endif
            // Append any leftover values to the POST body
            var nonAuthParameters = GetPostParametersValue(postParameters, true);
            if (body.IsNullOrBlank())
            {
                body = nonAuthParameters;
            }
            else
            {
                if (!nonAuthParameters.IsNullOrBlank())
                {
                    body += "&".Then(nonAuthParameters);
                }
            }

            content = Encoding.UTF8.GetBytes(body);
#if !SILVERLIGHT
            request.ContentLength = content.Length;
            // Silverlight sets this dynamically
#endif
            return request;
        }
        protected override HttpWebRequest BuildMultiPartFormRequest(PostOrPut method, string url,
                                                                    IEnumerable<HttpPostParameter> parameters,
                                                                    out byte[] bytes)
        {
            var boundary = Guid.NewGuid().ToString();
            var request = (HttpWebRequest) WebRequest.Create(url);

#if !SILVERLIGHT
    // todo we can probably remove these anyway
            request.PreAuthenticate = true;
            request.AllowWriteStreamBuffering = true;
#endif
            request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
            request.Method = method == PostOrPut.Post ? "POST" : "PUT";

            SetAuthorizationHeader(request, "Authorization");

            var contents = BuildMultiPartFormRequestParameters(boundary, parameters);
            var payload = contents.ToString();

#if !Smartphone
            bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(payload);
#else
            bytes = Encoding.GetEncoding(1252).GetBytes(payload);
#endif

#if !SILVERLIGHT
            request.ContentLength = bytes.Length;
#endif
            return request;
        }
示例#7
0
        protected virtual IAsyncResult ExecutePostOrPutAsync(PostOrPut method, string url, string prefixKey,
                                                             IClientCache cache, TimeSpan slidingExpiration)
        {
            WebResponse = null;

            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var state = new Pair<WebRequest, Pair<byte[], Triplet<IClientCache, TimeSpan, string>>>
                            {
                                First = request,
                                Second = new Pair<byte[], Triplet<IClientCache, TimeSpan, string>>
                                             {
                                                 First = content,
                                                 Second = new Triplet<IClientCache, TimeSpan, string>
                                                              {
                                                                  First = cache,
                                                                  Second = slidingExpiration,
                                                                  Third = prefixKey
                                                              }
                                             }
                            };

            var args = new WebQueryRequestEventArgs(url);
            OnQueryRequest(args);

            return request.BeginGetRequestStream(PostAsyncRequestCallback, state);
        }
示例#8
0
        protected virtual void ExecutePostOrPutAsync(PostOrPut method, string url,
                                                     IEnumerable<HttpPostParameter> parameters)
        {
            WebResponse = null;

            // Credit to Sean Erickson for providing a clean 
            // implementation of multi-part data posting
            byte[] content;
            var request = BuildMultiPartFormRequest(method, url, parameters, out content);

            var state = new Pair<WebRequest, byte[]> {First = request, Second = content};

            var args = new WebQueryRequestEventArgs(url);
            OnQueryRequest(args);

            request.BeginGetRequestStream(PostAsyncRequestCallback, state);
        }
示例#9
0
        protected virtual IAsyncResult ExecutePostOrPutAsync(PostOrPut method, string url)
        {
            WebResponse = null;

            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var state = new Pair<WebRequest, byte[]> {First = request, Second = content};

            var args = new WebQueryRequestEventArgs(url);
            OnQueryRequest(args);

            return request.BeginGetRequestStream(PostAsyncRequestCallback, state);
        }
示例#10
0
        protected virtual WebRequest BuildPostOrPutWebRequest(PostOrPut method, string url, out byte[] content)
        {
            url = AppendParameters(url);

            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = method == PostOrPut.Post ? "POST" : "PUT";
            request.ContentType = "application/x-www-form-urlencoded";

#if !SILVERLIGHT
            if (!Proxy.IsNullOrBlank())
            {
                SetWebProxy(request);
            }
#endif
            if (!UserAgent.IsNullOrBlank())
            {
#if !SILVERLIGHT
                request.UserAgent = UserAgent;
#else
                request.Headers["User-Agent"] = UserAgent;
#endif
            }

            if (UseCompression)
            {
#if !SILVERLIGHT
                request.AutomaticDecompression = DecompressionMethods.GZip;
#else
                // todo will need decompression on response
                request.Accept = "gzip,deflate";
#endif
            }
#if !SILVERLIGHT
            if (RequestTimeout.HasValue)
            {
                request.Timeout = (int)RequestTimeout.Value.TotalMilliseconds;
            }
#endif
            AppendHeaders(request);

#if !SILVERLIGHT
            content = Encoding.ASCII.GetBytes(url);
            request.ContentLength = content.Length;

            if (KeepAlive)
            {
                request.KeepAlive = true;
            }
#else
            // todo check implications
            content = Encoding.UTF8.GetBytes(url);
#endif
            return request;
        }
示例#11
0
 private string ExecutePostOrPutAndCacheWithExpiry(PostOrPut method, IClientCache cache, string url, string key,
                                              TimeSpan slidingExpiration, out WebException exception)
 {
     var result = ExecutePostOrPut(method, url, out exception);
     if (exception == null)
     {
         cache.Insert(CreateCacheKey(key, url), result, slidingExpiration);
     }
     return result;
 }
示例#12
0
 public virtual string ExecutePostOrPut(PostOrPut method, string url, string key, IClientCache cache, TimeSpan slidingExpiration, out WebException exception )
 {
     WebException ex = null; 
     var ret = ExecuteWithCacheAndSlidingExpiration(cache, url, key, slidingExpiration,
                                                 (c, u, e) =>
                                                 ExecutePostOrPutAndCacheWithExpiry(method, cache, url, key, slidingExpiration, out ex));
     exception = ex; 
     return ret; 
 }
示例#13
0
 public virtual string ExecutePostOrPut( PostOrPut method, string url, string key, IClientCache cache, out WebException exception)
 {
     WebException ex = null; 
     var ret = ExecuteWithCache(cache, url, key, (c, u) => ExecutePostOrPutAndCache(method, cache, url, key, out ex));
     exception = ex;
     return ret; 
 }
示例#14
0
        protected virtual string ExecutePostOrPut(PostOrPut method, string url, IEnumerable<HttpPostParameter> parameters)
        {
            WebResponse = null;
            byte[] bytes;
            var request = BuildMultiPartFormRequest(method, url, parameters, out bytes);

            using (var requestStream = request.GetRequestStream())
            {
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Flush();
                requestStream.Close();

                // Avoid disposing until no longer needed to build results
                var response = request.GetResponse();
                WebResponse = response;

                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    var result = reader.ReadToEnd();

                    var responseArgs = new WebQueryResponseEventArgs(result);
                    OnQueryResponse(responseArgs);

                    WebResponse = response;
                    return result;
                }
            }
        }
示例#15
0
        protected virtual string ExecutePostOrPut(PostOrPut method, string url, out WebException exception)
        {
            WebResponse = null;
            exception = null;
            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var requestArgs = new WebQueryRequestEventArgs(url);
            OnQueryRequest(requestArgs);

            try
            {
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(content, 0, content.Length);
                    stream.Close();

                    // Avoid disposing until no longer needed to build results
                    var response = request.GetResponse();
                    WebResponse = response;

                    using (var reader = new StreamReader(response.GetResponseStream()))
                    {
                        var result = reader.ReadToEnd();

                        var responseArgs = new WebQueryResponseEventArgs(result);
                        OnQueryResponse(responseArgs);

                        return result;
                    }
                }
            }
            catch (WebException ex)
            {
                exception = ex; 
                return HandleWebException(ex);
            }
        }
示例#16
0
        public virtual void ExecuteStreamPost(PostOrPut method, string url, TimeSpan duration, int resultCount)
        {
            WebResponse = null;
            byte[] content;
            var request = BuildPostOrPutWebRequest(method, url, out content);

            var requestArgs = new WebQueryRequestEventArgs(url);
            OnQueryRequest(requestArgs);

            Stream stream = null;
            try
            {
                using (stream = request.GetRequestStream())
                {
                    stream.Write(content, 0, content.Length);
                    stream.Close();

                    var response = request.GetResponse();
                    WebResponse = response;
                    
                    using (var responseStream = response.GetResponseStream())
                    {
                        // [DC]: cannot refactor this block to common method; will cause hwr to hang
                        var count = 0;
                        var results = new List<string>();
                        var start = DateTime.UtcNow;

                        using (var reader = new StreamReader(responseStream))
                        {
                            var line = "";

                            while ((line = reader.ReadLine()).Length > 0)
                            {
                                if (line.Equals(Environment.NewLine))
                                {
                                    // Keep-Alive
                                    continue;
                                }

                                if (line.Equals("<html>"))
                                {
                                    // We're looking at a 401 or similar; construct error result?
                                    return;
                                }

                                results.Add(line);
                                count++;

                                if (count < resultCount)
                                {
                                    // Result buffer
                                    continue;
                                }

                                var sb = new StringBuilder();
                                foreach (var result in results)
                                {
                                    sb.AppendLine(result);
                                }

                                var responseArgs = new WebQueryResponseEventArgs(sb.ToString());
                                OnQueryResponse(responseArgs);

                                count = 0;

                                var now = DateTime.UtcNow;
                                if (now.Subtract(start) >= duration)
                                {
                                    // Time elapsed
                                    request.Abort();
                                    return;
                                }
                            }

                            // Stream dried up
                        }
                    }
                }
            }
            catch (WebException)
            {
                // 
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
        }