示例#1
0
        private static async Task <CurlResponse> FollowRedirect(string url, CurlResponse response)
        {
            var    uri = new Uri(url);
            string redirect;

            if (response.Headers.TryGetValue("location", out redirect))
            {
                string cookie = response.CookieHeader;
                if (!redirect.StartsWith("http://") && !redirect.StartsWith("https://"))
                {
                    if (redirect.StartsWith("/"))
                    {
                        redirect = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, redirect);
                    }
                    else
                    {
                        redirect = string.Format("{0}://{1}/{2}", uri.Scheme, uri.Host, redirect);
                    }
                }
                var newRedirect = await GetAsync(redirect, cookie);

                foreach (var c in response.Cookies)
                {
                    newRedirect.Cookies[c.Key] = c.Value;
                }
                newRedirect.AddCookiesFromHeaders(response.HeaderList);
                return(newRedirect);
            }
            else
            {
                return(response);
            }
        }
        private void OnSiteResponse(CurlResponse curlResponse)
        {
            WindowProgress = (double)curlResponse.Index / Profile.PlayTimes;
            ResponseList.Insert(0, curlResponse);

            OnPropertyChanged("WindowProgress");
        }
示例#3
0
        private void PollStatus(CurlResponse curlResponse)
        {
            var completed = false;

            while (!completed)
            {
                var jobStatusResult = this.GetSprintStatus(curlResponse.job_id);
                completed = jobStatusResult.status != "running" && jobStatusResult.status != "queued";
                SprintStatusChanged(this, jobStatusResult);
                Thread.Sleep(2000);
            }
        }
示例#4
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            lock (instance)
            {
                var headerBuffers = new List<byte[]>();
                var contentBuffers = new List<byte[]>();

                using (var easy = new CurlEasy())
                {
                    easy.Url = curlRequest.Url;
                    easy.BufferSize = 64 * 1024;
                    easy.UserAgent = BrowserUtil.ChromeUserAgent;
                    easy.FollowLocation = false;
                    easy.ConnectTimeout  = 20;
                    easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                    {
                        contentBuffers.Add(buf);
                        return size * nmemb;
                    };
                    easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                    {
                        headerBuffers.Add(buf);
                        return size * nmemb;
                    };

                    if (!string.IsNullOrEmpty(curlRequest.Cookies))
                        easy.Cookie = curlRequest.Cookies;

                    if (!string.IsNullOrEmpty(curlRequest.Referer))
                        easy.Referer = curlRequest.Referer;

                    if (curlRequest.Method == HttpMethod.Post)
                    {
                        easy.Post = true;
                        var postString = new FormUrlEncodedContent(curlRequest.PostData).ReadAsStringAsync().Result;
                        easy.PostFields = postString;
                        easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                    }

                    easy.Perform();
                }

                var headerBytes = Combine(headerBuffers.ToArray());
                var headerString = Encoding.UTF8.GetString(headerBytes);
                var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                var headers = new List<string[]>();
                var headerCount = 0;
                HttpStatusCode status = HttpStatusCode.InternalServerError;
                foreach (var headerPart in headerParts)
                {
                    if (headerCount == 0)
                    {
                        var responseCode = int.Parse(headerPart.Split(' ')[1]);
                        status = (HttpStatusCode)responseCode;
                    }
                    else
                    {
                        var keyVal = headerPart.Split(new char[] { ':' }, 2);
                        if (keyVal.Length > 1)
                        {
                            headers.Add(new[] { keyVal[0].ToLower().Trim(), keyVal[1].Trim() });
                        }
                    }

                    headerCount++;
                }

                var contentBytes = Combine(contentBuffers.ToArray());

                var curlResponse = new CurlResponse(headers, contentBytes, status);
                if (!string.IsNullOrEmpty(curlRequest.Cookies))
                    curlResponse.AddCookiesFromHeaderValue(curlRequest.Cookies);
                curlResponse.AddCookiesFromHeaders(headers);

                return curlResponse;
            }
        }
示例#5
0
 private static async Task<CurlResponse> FollowRedirect(string url, CurlResponse response)
 {
     var uri = new Uri(url);
     string redirect;
     if (response.Headers.TryGetValue("location", out redirect))
     {
         string cookie = response.CookieHeader;
         if (!redirect.StartsWith("http://") && !redirect.StartsWith("https://"))
         {
             if (redirect.StartsWith("/"))
                 redirect = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, redirect);
             else
                 redirect = string.Format("{0}://{1}/{2}", uri.Scheme, uri.Host, redirect);
         }
         var newRedirect = await GetAsync(redirect, cookie);
         foreach (var c in response.Cookies)
             newRedirect.Cookies[c.Key] = c.Value;
         newRedirect.AddCookiesFromHeaders(response.HeaderList);
         return newRedirect;
     }
     else
         return response;
 }
示例#6
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            lock (instance)
            {
                var headerBuffers = new List<byte[]>();
                var contentBuffers = new List<byte[]>();

                using (var easy = new CurlEasy())
                {
                    
                    easy.Url = curlRequest.Url;
                    easy.BufferSize = 64 * 1024;
                    easy.UserAgent = BrowserUtil.ChromeUserAgent;
                    easy.FollowLocation = false;
                    easy.ConnectTimeout = 20;
                    if(curlRequest.Headers != null)
                    {
                        CurlSlist curlHeaders = new CurlSlist();
                        foreach (var header in curlRequest.Headers)
                        {
                            curlHeaders.Append(header.Key + ": " + header.Value);
                        }
                        easy.SetOpt(CurlOption.HttpHeader, curlHeaders);
                    }

                    easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                    {
                        contentBuffers.Add(buf);
                        return size * nmemb;
                    };

                    easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                    {
                        headerBuffers.Add(buf);
                        return size * nmemb;
                    };

                    if (!string.IsNullOrEmpty(curlRequest.Cookies))
                        easy.Cookie = curlRequest.Cookies;

                    if (!string.IsNullOrEmpty(curlRequest.Referer))
                        easy.Referer = curlRequest.Referer;

                    if (curlRequest.Method == HttpMethod.Post)
                    {
                        if (!string.IsNullOrEmpty(curlRequest.RawPOSTDdata))
                        {
                            easy.Post = true;
                            easy.PostFields = curlRequest.RawPOSTDdata;
                            easy.PostFieldSize = Encoding.UTF8.GetByteCount(curlRequest.RawPOSTDdata);
                        }
                        else
                        {
                            easy.Post = true;
                            var postString = StringUtil.PostDataFromDict(curlRequest.PostData);
                            easy.PostFields = postString;
                            easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                        }
                    }

                    if (Startup.DoSSLFix == true)
                    {
                        // http://stackoverflow.com/questions/31107851/how-to-fix-curl-35-cannot-communicate-securely-with-peer-no-common-encryptio
                        // https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
                        easy.SslCipherList = SSLFix.CipherList;
                        easy.FreshConnect = true;
                        easy.ForbidReuse = true;
                    }

                    if (Startup.IgnoreSslErrors == true)
                    {
                        easy.SetOpt(CurlOption.SslVerifyhost, false);
                        easy.SetOpt(CurlOption.SslVerifyPeer, false);
                    }

                    if (Startup.ProxyConnection != null)
                    {
                        easy.SetOpt(CurlOption.Proxy, Startup.ProxyConnection);
                    }                    

                    easy.Perform();

                    if (easy.LastErrorCode != CurlCode.Ok)
                    {
                        var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription + " " + easy.ErrorBuffer;
                        if (null != OnErrorMessage)
                            OnErrorMessage(message);
                        else
                            Console.WriteLine(message);
                    }
                }

                var headerBytes = Combine(headerBuffers.ToArray());
                var headerString = Encoding.UTF8.GetString(headerBytes);
                if (Startup.ProxyConnection != null)
                {
                    var firstcrlf = headerString.IndexOf("\r\n\r\n");
                    var secondcrlf = headerString.IndexOf("\r\n\r\n", firstcrlf + 1);
                    if (secondcrlf > 0)
                    {
                        headerString = headerString.Substring(firstcrlf + 4, secondcrlf - (firstcrlf));
                    }
                }
                var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                var headers = new List<string[]>();
                var headerCount = 0;
                HttpStatusCode status = HttpStatusCode.NotImplemented;
                var cookieBuilder = new StringBuilder();
                var cookies = new List<Tuple<string, string>>();
                foreach (var headerPart in headerParts)
                {
                    if (headerCount == 0)
                    {
                        var split = headerPart.Split(' ');
                        if (split.Length < 2)
                            throw new Exception("HTTP Header missing");
                        var responseCode = int.Parse(headerPart.Split(' ')[1]);
                        status = (HttpStatusCode)responseCode;
                    }
                    else
                    {
                        var keyVal = headerPart.Split(new char[] { ':' }, 2);
                        if (keyVal.Length > 1)
                        {
                            var key = keyVal[0].ToLower().Trim();
                            var value = keyVal[1].Trim();

                            if (key == "set-cookie")
                            {
                                var nameSplit = value.IndexOf('=');
                                if (nameSplit > -1) {
                                    cookies.Add(new Tuple<string, string>(value.Substring(0, nameSplit), value.Substring(0, value.IndexOf(';') + 1)));
                                }
                            }
                            else
                            {
                                headers.Add(new[] { key, value });
                            }
                        }
                    }

                    headerCount++;
                }

                foreach (var cookieGroup in cookies.GroupBy(c => c.Item1))
                {
                    cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
                }

                // add some debug output to track down the problem causing people getting InternalServerError results
                if (status == HttpStatusCode.NotImplemented || status == HttpStatusCode.InternalServerError)
                {
                    try
                    {
                        OnErrorMessage("got NotImplemented/InternalServerError");
                        OnErrorMessage("request.Method: " + curlRequest.Method);
                        OnErrorMessage("request.Url: " + curlRequest.Url);
                        OnErrorMessage("request.Cookies: " + curlRequest.Cookies);
                        OnErrorMessage("request.Referer: " + curlRequest.Referer);
                        OnErrorMessage("request.RawPOSTDdata: " + curlRequest.RawPOSTDdata);
                        OnErrorMessage("cookies: "+ cookieBuilder.ToString().Trim());
                        OnErrorMessage("headerString:\n" + headerString);
                    
                        foreach (var headerPart in headerParts)
                        {
                            OnErrorMessage("headerParts: "+headerPart);
                        }
                    }
                    catch (Exception ex)
                    {
                        OnErrorMessage(string.Format("CurlHelper: error while handling NotImplemented/InternalServerError:\n{0}", ex));
                    }
                }
                
                var contentBytes = Combine(contentBuffers.ToArray());
                var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().Trim());
                return curlResponse;
            }
        }
示例#7
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            lock (instance)
            {
                var headerBuffers  = new List <byte[]>();
                var contentBuffers = new List <byte[]>();

                using (var easy = new CurlEasy())
                {
                    easy.Url            = curlRequest.Url;
                    easy.BufferSize     = 64 * 1024;
                    easy.UserAgent      = BrowserUtil.ChromeUserAgent;
                    easy.FollowLocation = false;
                    easy.ConnectTimeout = 20;

                    easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                    {
                        contentBuffers.Add(buf);
                        return(size * nmemb);
                    };

                    easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                    {
                        headerBuffers.Add(buf);
                        return(size * nmemb);
                    };

                    if (!string.IsNullOrEmpty(curlRequest.Cookies))
                    {
                        easy.Cookie = curlRequest.Cookies;
                    }

                    if (!string.IsNullOrEmpty(curlRequest.Referer))
                    {
                        easy.Referer = curlRequest.Referer;
                    }

                    if (curlRequest.Method == HttpMethod.Post)
                    {
                        easy.Post = true;
                        var postString = StringUtil.PostDataFromDict(curlRequest.PostData);
                        easy.PostFields    = postString;
                        easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                    }

                    if (Startup.DoSSLFix == true)
                    {
                        // http://stackoverflow.com/questions/31107851/how-to-fix-curl-35-cannot-communicate-securely-with-peer-no-common-encryptio
                        // https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
                        easy.SslCipherList = SSLFix.CipherList;
                        easy.FreshConnect  = true;
                        easy.ForbidReuse   = true;
                    }

                    easy.Perform();

                    if (easy.LastErrorCode != CurlCode.Ok)
                    {
                        var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription;
                        if (null != OnErrorMessage)
                        {
                            OnErrorMessage(message);
                        }
                        else
                        {
                            Console.WriteLine(message);
                        }
                    }
                }

                var            headerBytes   = Combine(headerBuffers.ToArray());
                var            headerString  = Encoding.UTF8.GetString(headerBytes);
                var            headerParts   = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                var            headers       = new List <string[]>();
                var            headerCount   = 0;
                HttpStatusCode status        = HttpStatusCode.InternalServerError;
                var            cookieBuilder = new StringBuilder();
                foreach (var headerPart in headerParts)
                {
                    if (headerCount == 0)
                    {
                        var split = headerPart.Split(' ');
                        if (split.Length < 2)
                        {
                            throw new Exception("HTTP Header missing");
                        }
                        var responseCode = int.Parse(headerPart.Split(' ')[1]);
                        status = (HttpStatusCode)responseCode;
                    }
                    else
                    {
                        var keyVal = headerPart.Split(new char[] { ':' }, 2);
                        if (keyVal.Length > 1)
                        {
                            var key   = keyVal[0].ToLower().Trim();
                            var value = keyVal[1].Trim();

                            if (key == "set-cookie")
                            {
                                cookieBuilder.AppendFormat("{0} ", value.Substring(0, value.IndexOf(';') + 1));
                            }
                            else
                            {
                                headers.Add(new[] { key, value });
                            }
                        }
                    }

                    headerCount++;
                }

                var contentBytes = Combine(contentBuffers.ToArray());
                var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().TrimEnd());
                return(curlResponse);
            }
        }
示例#8
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            Curl.GlobalInit(CurlInitFlag.All);

            var headerBuffers  = new List <byte[]>();
            var contentBuffers = new List <byte[]>();

            using (var easy = new CurlEasy())
            {
                easy.Url           = curlRequest.Url;
                easy.BufferSize    = 64 * 1024;
                easy.UserAgent     = ChromeUserAgent;
                easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                {
                    contentBuffers.Add(buf);
                    return(size * nmemb);
                };
                easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                {
                    headerBuffers.Add(buf);
                    return(size * nmemb);
                };

                if (!string.IsNullOrEmpty(curlRequest.Cookies))
                {
                    easy.Cookie = curlRequest.Cookies;
                }

                if (!string.IsNullOrEmpty(curlRequest.Referer))
                {
                    easy.Referer = curlRequest.Referer;
                }

                if (curlRequest.Method == HttpMethod.Post)
                {
                    easy.Post = true;
                    var postString = new FormUrlEncodedContent(curlRequest.PostData).ReadAsStringAsync().Result;
                    easy.PostFields    = postString;
                    easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                }

                easy.Perform();
            }

            var headerBytes  = Combine(headerBuffers.ToArray());
            var headerString = Encoding.UTF8.GetString(headerBytes);
            var headerParts  = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            var headers      = new List <string[]>();

            foreach (var headerPart in headerParts.Skip(1))
            {
                var keyVal = headerPart.Split(new char[] { ':' }, 2);
                if (keyVal.Length > 1)
                {
                    headers.Add(new[] { keyVal[0].ToLower().Trim(), keyVal[1].Trim() });
                }
            }

            var contentBytes = Combine(contentBuffers.ToArray());
            var curlResponse = new CurlResponse(headers, contentBytes);

            if (!string.IsNullOrEmpty(curlRequest.Cookies))
            {
                curlResponse.AddCookiesFromHeaderValue(curlRequest.Cookies);
            }
            curlResponse.AddCookiesFromHeaders(headers);

            return(curlResponse);
        }
示例#9
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            lock (instance)
            {
                var headerBuffers = new List<byte[]>();
                var contentBuffers = new List<byte[]>();

                using (var easy = new CurlEasy())
                {
                    easy.Url = curlRequest.Url;
                    easy.BufferSize = 64 * 1024;
                    easy.UserAgent = BrowserUtil.ChromeUserAgent;
                    easy.FollowLocation = false;
                    easy.ConnectTimeout  = 20;

                    easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                    {
                        contentBuffers.Add(buf);
                        return size * nmemb;
                    };

                    easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                    {
                        headerBuffers.Add(buf);
                        return size * nmemb;
                    };

                    if (!string.IsNullOrEmpty(curlRequest.Cookies))
                        easy.Cookie = curlRequest.Cookies;

                    if (!string.IsNullOrEmpty(curlRequest.Referer))
                        easy.Referer = curlRequest.Referer;

                    if (curlRequest.Method == HttpMethod.Post)
                    {
                        easy.Post = true;
                        var postString = new FormUrlEncodedContent(curlRequest.PostData).ReadAsStringAsync().Result;
                        easy.PostFields = postString;
                        easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                    }

                    if (Startup.DoSSLFix == true)
                    {
                        // http://stackoverflow.com/questions/31107851/how-to-fix-curl-35-cannot-communicate-securely-with-peer-no-common-encryptio
                        // https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
                        easy.SslCipherList = SSLFix.CipherList;
                        easy.FreshConnect = true;
                        easy.ForbidReuse = true;
                    }

                    easy.Perform();

                    if(easy.LastErrorCode != CurlCode.Ok)
                    {
                        var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription;
                        if (null != OnErrorMessage)
                            OnErrorMessage(message);
                        else
                            Console.WriteLine(message);
                    }
                }

                var headerBytes = Combine(headerBuffers.ToArray());
                var headerString = Encoding.UTF8.GetString(headerBytes);
                var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                var headers = new List<string[]>();
                var headerCount = 0;
                HttpStatusCode status = HttpStatusCode.InternalServerError;
                var cookieBuilder = new StringBuilder();
                foreach (var headerPart in headerParts)
                {
                    if (headerCount == 0)
                    {
                        var split = headerPart.Split(' ');
                        if (split.Length < 2)
                            throw new Exception("HTTP Header missing");
                        var responseCode = int.Parse(headerPart.Split(' ')[1]);
                        status = (HttpStatusCode)responseCode;
                    }
                    else
                    {
                        var keyVal = headerPart.Split(new char[] { ':' }, 2);
                        if (keyVal.Length > 1)
                        {
                            var key = keyVal[0].ToLower().Trim();
                            var value = keyVal[1].Trim();

                            if (key == "set-cookie")
                            {
                                cookieBuilder.AppendFormat("{0} ", value.Substring(0, value.IndexOf(';') + 1));
                            }
                            else
                            {
                                headers.Add(new[] { key, value });
                            }
                        }
                    }

                    headerCount++;
                }

                var contentBytes = Combine(contentBuffers.ToArray());
                var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().TrimEnd());
                return curlResponse;
            }
        }
示例#10
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest)
        {
            Curl.GlobalInit(CurlInitFlag.All);

            var headerBuffers = new List<byte[]>();
            var contentBuffers = new List<byte[]>();

            using (var easy = new CurlEasy())
            {
                easy.Url = curlRequest.Url;
                easy.BufferSize = 64 * 1024;
                easy.UserAgent = ChromeUserAgent;
                easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                {
                    contentBuffers.Add(buf);
                    return size * nmemb;
                };
                easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                {
                    headerBuffers.Add(buf);
                    return size * nmemb;
                };

                if (!string.IsNullOrEmpty(curlRequest.Cookies))
                    easy.Cookie = curlRequest.Cookies;

                if (!string.IsNullOrEmpty(curlRequest.Referer))
                    easy.Referer = curlRequest.Referer;

                if (curlRequest.Method == HttpMethod.Post)
                {
                    easy.Post = true;
                    var postString = new FormUrlEncodedContent(curlRequest.PostData).ReadAsStringAsync().Result;
                    easy.PostFields = postString;
                    easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                }

                easy.Perform();
            }

            var headerBytes = Combine(headerBuffers.ToArray());
            var headerString = Encoding.UTF8.GetString(headerBytes);
            var headerParts = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            var headers = new List<string[]>();
            foreach (var headerPart in headerParts.Skip(1))
            {
                var keyVal = headerPart.Split(new char[] { ':' }, 2);
                if (keyVal.Length > 1)
                {
                    headers.Add(new[] { keyVal[0].ToLower().Trim(), keyVal[1].Trim() });
                }
            }

            var contentBytes = Combine(contentBuffers.ToArray());
            var curlResponse = new CurlResponse(headers, contentBytes);

            if (!string.IsNullOrEmpty(curlRequest.Cookies))
                curlResponse.AddCookiesFromHeaderValue(curlRequest.Cookies);
            curlResponse.AddCookiesFromHeaders(headers);

            return curlResponse;

        }
示例#11
0
        public static CurlResponse PerformCurl(CurlRequest curlRequest, ServerConfig config)
        {
            lock (instance)
            {
                var headerBuffers  = new List <byte[]>();
                var contentBuffers = new List <byte[]>();

                using (var easy = new CurlEasy())
                {
                    easy.Url            = curlRequest.Url;
                    easy.BufferSize     = 64 * 1024;
                    easy.UserAgent      = BrowserUtil.ChromeUserAgent;
                    easy.FollowLocation = false;
                    easy.ConnectTimeout = 20;
                    if (curlRequest.Headers != null)
                    {
                        CurlSlist curlHeaders = new CurlSlist();
                        foreach (var header in curlRequest.Headers)
                        {
                            curlHeaders.Append(header.Key + ": " + header.Value);
                        }
                        easy.SetOpt(CurlOption.HttpHeader, curlHeaders);
                    }

                    easy.WriteFunction = (byte[] buf, int size, int nmemb, object data) =>
                    {
                        contentBuffers.Add(buf);
                        return(size * nmemb);
                    };

                    easy.HeaderFunction = (byte[] buf, int size, int nmemb, object extraData) =>
                    {
                        headerBuffers.Add(buf);
                        return(size * nmemb);
                    };

                    if (!string.IsNullOrEmpty(curlRequest.Cookies))
                    {
                        easy.Cookie = curlRequest.Cookies;
                    }

                    if (!string.IsNullOrEmpty(curlRequest.Referer))
                    {
                        easy.Referer = curlRequest.Referer;
                    }

                    if (curlRequest.Method == HttpMethod.Post)
                    {
                        if (!string.IsNullOrEmpty(curlRequest.RawPOSTDdata))
                        {
                            easy.Post          = true;
                            easy.PostFields    = curlRequest.RawPOSTDdata;
                            easy.PostFieldSize = Encoding.UTF8.GetByteCount(curlRequest.RawPOSTDdata);
                        }
                        else
                        {
                            easy.Post = true;
                            var postString = StringUtil.PostDataFromDict(curlRequest.PostData);
                            easy.PostFields    = postString;
                            easy.PostFieldSize = Encoding.UTF8.GetByteCount(postString);
                        }
                    }

                    if (JackettStartup.DoSSLFix == true)
                    {
                        // http://stackoverflow.com/questions/31107851/how-to-fix-curl-35-cannot-communicate-securely-with-peer-no-common-encryptio
                        // https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
                        easy.SslCipherList = SSLFix.CipherList;
                        easy.FreshConnect  = true;
                        easy.ForbidReuse   = true;
                    }

                    if (JackettStartup.IgnoreSslErrors == true)
                    {
                        easy.SetOpt(CurlOption.SslVerifyhost, false);
                        easy.SetOpt(CurlOption.SslVerifyPeer, false);
                    }

                    var proxy = config.GetProxyUrl();
                    if (proxy != null)
                    {
                        easy.SetOpt(CurlOption.HttpProxyTunnel, 1);
                        easy.SetOpt(CurlOption.Proxy, proxy);

                        var authString = config.GetProxyAuthString();
                        if (authString != null)
                        {
                            easy.SetOpt(CurlOption.ProxyUserPwd, authString);
                        }
                    }

                    easy.Perform();

                    if (easy.LastErrorCode != CurlCode.Ok)
                    {
                        var message = "Error " + easy.LastErrorCode.ToString() + " " + easy.LastErrorDescription + " " + easy.ErrorBuffer;
                        if (null != OnErrorMessage)
                        {
                            OnErrorMessage(message);
                        }
                        else
                        {
                            Console.WriteLine(message);
                        }
                    }
                }

                var headerBytes  = Combine(headerBuffers.ToArray());
                var headerString = Encoding.UTF8.GetString(headerBytes);
                if (config.GetProxyUrl() != null)
                {
                    var firstcrlf  = headerString.IndexOf("\r\n\r\n");
                    var secondcrlf = headerString.IndexOf("\r\n\r\n", firstcrlf + 1);
                    if (secondcrlf > 0)
                    {
                        headerString = headerString.Substring(firstcrlf + 4, secondcrlf - (firstcrlf));
                    }
                }
                var            headerParts   = headerString.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                var            headers       = new List <string[]>();
                var            headerCount   = 0;
                HttpStatusCode status        = HttpStatusCode.NotImplemented;
                var            cookieBuilder = new StringBuilder();
                var            cookies       = new List <Tuple <string, string> >();
                foreach (var headerPart in headerParts)
                {
                    if (headerCount == 0)
                    {
                        var split = headerPart.Split(' ');
                        if (split.Length < 2)
                        {
                            throw new Exception("HTTP Header missing");
                        }
                        var responseCode = int.Parse(headerPart.Split(' ')[1]);
                        status = (HttpStatusCode)responseCode;
                    }
                    else
                    {
                        var keyVal = headerPart.Split(new char[] { ':' }, 2);
                        if (keyVal.Length > 1)
                        {
                            var key   = keyVal[0].ToLower().Trim();
                            var value = keyVal[1].Trim();

                            if (key == "set-cookie")
                            {
                                var nameSplit = value.IndexOf('=');
                                if (nameSplit > -1)
                                {
                                    var cKey = value.Substring(0, nameSplit);
                                    var cVal = value.Split(';')[0] + ";";
                                    cookies.Add(new Tuple <string, string>(cKey, cVal));
                                }
                            }
                            else
                            {
                                headers.Add(new[] { key, value });
                            }
                        }
                    }

                    headerCount++;
                }

                foreach (var cookieGroup in cookies.GroupBy(c => c.Item1))
                {
                    cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
                }

                // add some debug output to track down the problem causing people getting InternalServerError results
                if (status == HttpStatusCode.NotImplemented || status == HttpStatusCode.InternalServerError)
                {
                    try
                    {
                        OnErrorMessage("got NotImplemented/InternalServerError");
                        OnErrorMessage("request.Method: " + curlRequest.Method);
                        OnErrorMessage("request.Url: " + curlRequest.Url);
                        OnErrorMessage("request.Cookies: " + curlRequest.Cookies);
                        OnErrorMessage("request.Referer: " + curlRequest.Referer);
                        OnErrorMessage("request.RawPOSTDdata: " + curlRequest.RawPOSTDdata);
                        OnErrorMessage("cookies: " + cookieBuilder.ToString().Trim());
                        OnErrorMessage("headerString:\n" + headerString);

                        foreach (var headerPart in headerParts)
                        {
                            OnErrorMessage("headerParts: " + headerPart);
                        }
                    }
                    catch (Exception ex)
                    {
                        OnErrorMessage(string.Format("CurlHelper: error while handling NotImplemented/InternalServerError:\n{0}", ex));
                    }
                }

                var contentBytes = Combine(contentBuffers.ToArray());
                var curlResponse = new CurlResponse(headers, contentBytes, status, cookieBuilder.ToString().Trim());
                return(curlResponse);
            }
        }