static Task <WebResponse> ExecHttpRequestInternalAsync(Context ctx, CURLResource ch, Uri uri) { var req = WebRequest.CreateHttp(uri); // setup request: Debug.Assert(ch.Method != null, "Method == null"); req.Method = ch.Method; req.AllowAutoRedirect = ch.FollowLocation && ch.MaxRedirects != 0; req.Timeout = ch.Timeout <= 0 ? System.Threading.Timeout.Infinite : ch.Timeout; req.ContinueTimeout = ch.ContinueTimeout; req.Accept = "*/*"; // default value if (req.AllowAutoRedirect) { // equal or less than 0 will cause exception req.MaximumAutomaticRedirections = ch.MaxRedirects < 0 ? int.MaxValue : ch.MaxRedirects; } if (ch.CookieContainer != null) { if (ch.Result != null) { // pass cookies from previous response to the request AddCookies(ch.Result.Cookies, ch.CookieContainer); } req.CookieContainer = ch.CookieContainer; } //req.AutomaticDecompression = (DecompressionMethods)~0; // NOTICE: this nullify response Content-Length and Content-Encoding if (ch.CookieHeader != null) { TryAddCookieHeader(req, ch.CookieHeader); } if (ch.Username != null) { req.Credentials = new NetworkCredential(ch.Username, ch.Password ?? string.Empty); } // TODO: certificate if (!string.IsNullOrEmpty(ch.ProxyType) && !string.IsNullOrEmpty(ch.ProxyHost)) { req.Proxy = new WebProxy($"{ch.ProxyType}://{ch.ProxyHost}:{ch.ProxyPort}") { Credentials = string.IsNullOrEmpty(ch.ProxyUsername) ? null : new NetworkCredential(ch.ProxyUsername, ch.ProxyPassword ?? string.Empty) }; } else { // by default, curl does not go through system proxy req.Proxy = s_DefaultProxy; } // ch.ApplyOptions(ctx, req); // make request: // GET, HEAD if (string.Equals(ch.Method, WebRequestMethods.Http.Get, StringComparison.OrdinalIgnoreCase)) { WriteRequestStream(ctx, req, ch, ch.ProcessingRequest.Stream); } else if (string.Equals(ch.Method, WebRequestMethods.Http.Head, StringComparison.OrdinalIgnoreCase)) { // } // POST else if (string.Equals(ch.Method, WebRequestMethods.Http.Post, StringComparison.OrdinalIgnoreCase)) { ProcessPost(ctx, req, ch); } // PUT else if (string.Equals(ch.Method, WebRequestMethods.Http.Put, StringComparison.OrdinalIgnoreCase)) { ProcessPut(ctx, req, ch); } // DELETE, or custom method else { // custom method, nothing to do } // if (ch.StoreRequestHeaders) { ch.RequestHeaders = HttpHeaders.HeaderString(req); // and restore it when constructing CURLResponse } // return(req.GetResponseAsync()); }
static Task <WebResponse> ExecHttpRequestInternalAsync(Context ctx, CURLResource ch, Uri uri) { var req = WebRequest.CreateHttp(uri); // setup request: Debug.Assert(ch.Method != null, "Method == null"); req.Method = ch.Method; req.AllowAutoRedirect = ch.FollowLocation; req.Timeout = ch.Timeout; req.ContinueTimeout = ch.ContinueTimeout; req.MaximumAutomaticRedirections = ch.MaxRedirects; //req.AutomaticDecompression = (DecompressionMethods)~0; // NOTICE: this nullify response Content-Length and Content-Encoding if (ch.CookieHeader != null) { TryAddCookieHeader(req, ch.CookieHeader); } if (ch.CookieFileSet) { req.CookieContainer = new CookieContainer(); } if (ch.Username != null) { req.Credentials = new NetworkCredential(ch.Username, ch.Password ?? string.Empty); } if (ch.AcceptEncoding != null) { req.Accept = ch.AcceptEncoding; } // TODO: certificate // TODO: proxy foreach (var option in ch.Options) { option.Apply(req); } // make request: // GET, HEAD if (string.Equals(ch.Method, WebRequestMethods.Http.Get, StringComparison.OrdinalIgnoreCase) || string.Equals(ch.Method, WebRequestMethods.Http.Head, StringComparison.OrdinalIgnoreCase)) { // nothing to do } // POST else if (string.Equals(ch.Method, WebRequestMethods.Http.Post, StringComparison.OrdinalIgnoreCase)) { ProcessPost(ctx, req, ch); } // PUT else if (string.Equals(ch.Method, WebRequestMethods.Http.Put, StringComparison.OrdinalIgnoreCase)) { ProcessPut(req, ch); } // DELETE, or custom method else { // custom method, nothing to do } // if (ch.StoreRequestHeaders) { ch.RequestHeaders = HttpHeaders.HeaderString(req); // and restore it when constructing CURLResponse } // return(req.GetResponseAsync()); }