diff --git a/src/Jackett/CurlHelper.cs b/src/Jackett/CurlHelper.cs index 80e0b5245..22df91bdd 100644 --- a/src/Jackett/CurlHelper.cs +++ b/src/Jackett/CurlHelper.cs @@ -12,8 +12,16 @@ using System.Net; namespace Jackett { - public static class CurlHelper + public class CurlHelper { + private static readonly object instance = new object(); + + static CurlHelper() + { + Engine.Logger.Debug("LibCurl init" + Curl.GlobalInit(CurlInitFlag.All).ToString()); + Engine.Logger.Debug("LibCurl version " + Curl.Version); + } + public class CurlRequest { @@ -39,17 +47,11 @@ namespace Jackett public class CurlResponse { public Dictionary Headers { get; private set; } - public List HeaderList { get; private set; } - public byte[] Content { get; private set; } - public HttpStatusCode Status { get; private set;} - public Dictionary Cookies { get; private set; } - public List CookiesFlat { get { return Cookies.Select(c => c.Key + "=" + c.Value).ToList(); } } - public string CookieHeader { get { return string.Join("; ", CookiesFlat); } } public CurlResponse(List headers, byte[] content, HttpStatusCode s) @@ -94,17 +96,15 @@ namespace Jackett { var curlRequest = new CurlRequest(HttpMethod.Get, url, cookies, referer); var result = await PerformCurlAsync(curlRequest); - var checkedResult = await FollowRedirect(url, result); - return checkedResult; - } + return result; + } public static async Task PostAsync(string url, Dictionary formData, string cookies = null, string referer = null) { var curlRequest = new CurlRequest(HttpMethod.Post, url, cookies, referer); curlRequest.PostData = formData; var result = await PerformCurlAsync(curlRequest); - var checkedResult = await FollowRedirect(url, result); - return checkedResult; + return result; } private static async Task FollowRedirect(string url, CurlResponse response) @@ -139,78 +139,80 @@ namespace Jackett public static CurlResponse PerformCurl(CurlRequest curlRequest) { - Curl.GlobalInit(CurlInitFlag.All); - - var headerBuffers = new List(); - var contentBuffers = new List(); - - using (var easy = new CurlEasy()) + lock (instance) { - easy.Url = curlRequest.Url; - easy.BufferSize = 64 * 1024; - easy.UserAgent = BrowserUtil.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; - }; + var headerBuffers = new List(); + var contentBuffers = new List(); - if (!string.IsNullOrEmpty(curlRequest.Cookies)) - easy.Cookie = curlRequest.Cookies; - - if (!string.IsNullOrEmpty(curlRequest.Referer)) - easy.Referer = curlRequest.Referer; - - if (curlRequest.Method == HttpMethod.Post) + using (var easy = new CurlEasy()) { - 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(); - 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) + 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) => { - headers.Add(new[] { keyVal[0].ToLower().Trim(), keyVal[1].Trim() }); + 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(); } - headerCount++; + 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(); + 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; } - - 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; - } public static byte[] Combine(params byte[][] arrays) diff --git a/src/Jackett/Indexers/AlphaRatio.cs b/src/Jackett/Indexers/AlphaRatio.cs index 8cf4eaf78..b43c05333 100644 --- a/src/Jackett/Indexers/AlphaRatio.cs +++ b/src/Jackett/Indexers/AlphaRatio.cs @@ -105,7 +105,6 @@ namespace Jackett.Indexers dom["#loginform > table"].Remove(); var errorMessage = dom["#loginform"].Text().Trim().Replace("\n\t", " "); throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)config); - } else { diff --git a/src/Jackett/Indexers/BaseIndexer.cs b/src/Jackett/Indexers/BaseIndexer.cs index 951cac119..2d91818f2 100644 --- a/src/Jackett/Indexers/BaseIndexer.cs +++ b/src/Jackett/Indexers/BaseIndexer.cs @@ -24,7 +24,6 @@ namespace Jackett.Indexers protected Logger logger; protected IIndexerManagerService indexerService; - // protected IWebClient webClient; protected static List cache = new List(); protected static readonly TimeSpan cacheTime = new TimeSpan(0, 9, 0); @@ -42,7 +41,6 @@ namespace Jackett.Indexers TorznabCaps = caps; this.logger = logger; indexerService = manager; - // webClient = wc; } protected void SaveConfig(JToken config) diff --git a/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs b/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs index 2def39d6f..e1d39c323 100644 --- a/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs +++ b/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs @@ -55,6 +55,7 @@ namespace Jackett.Utils.Clients } } + logger.Debug(string.Format("UnixLibCurlWebClient: Returning", result.Status)); return result; } @@ -63,12 +64,14 @@ namespace Jackett.Utils.Clients logger.Debug(string.Format("UnixLibCurlWebClient:GetString(Url:{0})", request.Url)); var result = await GetBytes(request); - return new WebClientStringResult() + var sresult = new WebClientStringResult() { Content = Encoding.UTF8.GetString(result.Content), Cookies = result.Cookies, Status = result.Status }; + + return sresult; } } }