public static async Task<WebStream> CreateStream(string url, string postData, string encoding, string postencoding = "application/x-www-form-urlencoded", string uagent = null, NameValueCollection headers = null, CookieCollection cookies = null, int timeout = 10000, bool redirect = true, string referer = null, IWebProxy proxy = null) { WebStream wb = new WebStream(); try { do { Uri u = new Uri(url); if (string.IsNullOrEmpty(encoding)) encoding = "UTF-8"; int t = ServicePointManager.DefaultConnectionLimit; Uri bas = new Uri(u.Scheme + "://" + u.Host); HttpRequestMessage msg = new HttpRequestMessage(string.IsNullOrEmpty(postData) ? HttpMethod.Get : HttpMethod.Post, u); wb.DisposableObjects.Add(msg); if (!string.IsNullOrEmpty(uagent)) msg.Headers.UserAgent.ParseAdd(uagent); if (!string.IsNullOrEmpty(postData)) { byte[] dta = Encoding.GetEncoding(encoding).GetBytes(postData); msg.Content = new ByteArrayContent(dta, 0, dta.Length); msg.Content.Headers.ContentType = new MediaTypeHeaderValue(postencoding); } if (headers != null) PopulateHeaders(msg, headers); if (referer != null) msg.Headers.Referrer = new Uri(referer); HttpClientHandler handler = new HttpClientHandler(); wb.DisposableObjects.Add(handler); handler.AllowAutoRedirect = false; handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; if (cookies != null && cookies.Count > 0) { handler.CookieContainer = new CookieContainer(); foreach (Cookie c in cookies) { if (string.IsNullOrEmpty(c.Domain)) c.Domain = bas.Host; handler.CookieContainer.Add(c); } } if (proxy != null) handler.Proxy = proxy; HttpClient http = new HttpClient(handler); wb.DisposableObjects.Add(http); http.Timeout = TimeSpan.FromMilliseconds(timeout); HttpResponseMessage response = await http.SendAsync(msg); wb.DisposableObjects.Add(response); wb.DisposableObjects.Add(response.Content); wb.baseStream = await response.Content.ReadAsStreamAsync(); wb.ContentType = response.Content.Headers.ContentType.MediaType; wb.ContentEncoding = response.Content.Headers.ContentEncoding.ToString(); wb.ContentLength = response.Content.Headers.ContentLength ?? 0; wb.Headers = new NameValueCollection(); if (response.Headers.Contains("Set-Cookie")) { try { IEnumerable<string> sss=null; response.Headers.TryGetValues("Set-Cookie", out sss); wb.Cookies=new CookieCollection(); CookieCollection coll = null; if (sss != null) { wb.Cookies = GetAllCookiesFromHeader(sss, bas.ToString()); } if (cookies != null && cookies.Count > 0) { foreach (Cookie c in cookies) { bool found = false; foreach (Cookie d in wb.Cookies) { if (d.Name == c.Name) { found = true; break; } } if (!found) wb.Cookies.Add(c); } } } catch (Exception) { } } else { wb.Cookies = cookies; } if ((response.Headers != null) && (response.Headers.Any())) { if (wb.Headers==null) wb.Headers=new NameValueCollection(); foreach (KeyValuePair<string, IEnumerable<string>> h in response.Headers) { foreach (string r in h.Value) { string val = r; if (val.StartsWith("\"") && val.EndsWith("\"")) val = val.Substring(1, val.Length - 2); wb.Headers[h.Key] = val; } } } wb.StatusCode = response.StatusCode; if ((wb.StatusCode == HttpStatusCode.Found) || (wb.StatusCode == HttpStatusCode.Moved) || (wb.StatusCode == HttpStatusCode.Redirect)) { referer = url; if (!redirect) return wb; wb.Dispose(); if (response.Headers.Location.ToString().StartsWith("/")) url = u.Scheme + "://" + u.Host + response.Headers.Location; else url = response.Headers.Location.AbsoluteUri; UriBuilder bld = new UriBuilder(url); bld.Scheme = bas.Scheme; url = bld.Uri.ToString(); cookies = wb.Cookies; postData = null; } } while ((wb.StatusCode == HttpStatusCode.Found) || (wb.StatusCode == HttpStatusCode.Moved) || (wb.StatusCode == HttpStatusCode.Redirect)); return wb; } catch (Exception e) { wb?.Dispose(); return null; } }
public static async Task <WebStream> CreateStream(string url, string postData, string encoding, string postencoding = "application/x-www-form-urlencoded", string uagent = null, NameValueCollection headers = null, CookieCollection cookies = null, int timeout = 10000, bool redirect = true, string referer = null, IWebProxy proxy = null) { WebStream wb = new WebStream(); try { do { Uri u = new Uri(url); if (string.IsNullOrEmpty(encoding)) { encoding = "UTF-8"; } int t = ServicePointManager.DefaultConnectionLimit; Uri bas = new Uri(u.Scheme + "://" + u.Host); HttpRequestMessage msg = new HttpRequestMessage(string.IsNullOrEmpty(postData) ? HttpMethod.Get : HttpMethod.Post, u); wb.DisposableObjects.Add(msg); if (!string.IsNullOrEmpty(uagent)) { msg.Headers.UserAgent.ParseAdd(uagent); } if (!string.IsNullOrEmpty(postData)) { byte[] dta = Encoding.GetEncoding(encoding).GetBytes(postData); msg.Content = new ByteArrayContent(dta, 0, dta.Length); msg.Content.Headers.ContentType = new MediaTypeHeaderValue(postencoding); } if (headers != null) { PopulateHeaders(msg, headers); } if (referer != null) { msg.Headers.Referrer = new Uri(referer); } HttpClientHandler handler = new HttpClientHandler(); wb.DisposableObjects.Add(handler); handler.AllowAutoRedirect = false; handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; if (cookies != null && cookies.Count > 0) { handler.CookieContainer = new CookieContainer(); foreach (Cookie c in cookies) { if (string.IsNullOrEmpty(c.Domain)) { c.Domain = bas.Host; } handler.CookieContainer.Add(c); } } if (proxy != null) { handler.Proxy = proxy; } HttpClient http = new HttpClient(handler); wb.DisposableObjects.Add(http); http.Timeout = TimeSpan.FromMilliseconds(timeout); HttpResponseMessage response = await http.SendAsync(msg); wb.DisposableObjects.Add(response); wb.DisposableObjects.Add(response.Content); wb.baseStream = await response.Content.ReadAsStreamAsync(); wb.ContentType = response.Content.Headers.ContentType.MediaType; wb.ContentEncoding = response.Content.Headers.ContentEncoding.ToString(); wb.ContentLength = response.Content.Headers.ContentLength ?? 0; wb.Headers = new NameValueCollection(); if (response.Headers.Contains("Set-Cookie")) { try { IEnumerable <string> sss = null; response.Headers.TryGetValues("Set-Cookie", out sss); wb.Cookies = new CookieCollection(); CookieCollection coll = null; if (sss != null) { wb.Cookies = GetAllCookiesFromHeader(sss, bas.ToString()); } if (cookies != null && cookies.Count > 0) { foreach (Cookie c in cookies) { bool found = false; foreach (Cookie d in wb.Cookies) { if (d.Name == c.Name) { found = true; break; } } if (!found) { wb.Cookies.Add(c); } } } } catch (Exception) { } } else { wb.Cookies = cookies; } if ((response.Headers != null) && (response.Headers.Any())) { if (wb.Headers == null) { wb.Headers = new NameValueCollection(); } foreach (KeyValuePair <string, IEnumerable <string> > h in response.Headers) { foreach (string r in h.Value) { string val = r; if (val.StartsWith("\"") && val.EndsWith("\"")) { val = val.Substring(1, val.Length - 2); } wb.Headers[h.Key] = val; } } } wb.StatusCode = response.StatusCode; if ((wb.StatusCode == HttpStatusCode.Found) || (wb.StatusCode == HttpStatusCode.Moved) || (wb.StatusCode == HttpStatusCode.Redirect)) { referer = url; if (!redirect) { return(wb); } wb.Dispose(); if (response.Headers.Location.ToString().StartsWith("/")) { url = u.Scheme + "://" + u.Host + response.Headers.Location; } else { url = response.Headers.Location.AbsoluteUri; } UriBuilder bld = new UriBuilder(url); bld.Scheme = bas.Scheme; url = bld.Uri.ToString(); cookies = wb.Cookies; postData = null; } } while ((wb.StatusCode == HttpStatusCode.Found) || (wb.StatusCode == HttpStatusCode.Moved) || (wb.StatusCode == HttpStatusCode.Redirect)); return(wb); } catch (Exception e) { wb?.Dispose(); return(null); } }