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; }
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; }
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; }
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; }
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); }
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); }
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); }
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; }
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; }
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; }
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; }
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; } } }
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); } }
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(); } } }