From 51155ba9096b6c330e1e42f9e9fed40e6ebf42c0 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Sun, 12 Jul 2015 22:35:48 +0200 Subject: [PATCH] Applied workaround for CurlSharp GC handling. --- src/NzbDrone.Common/Http/CurlHttpClient.cs | 84 ++++++++++++---------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/src/NzbDrone.Common/Http/CurlHttpClient.cs b/src/NzbDrone.Common/Http/CurlHttpClient.cs index 683c43d67..68a2e9804 100644 --- a/src/NzbDrone.Common/Http/CurlHttpClient.cs +++ b/src/NzbDrone.Common/Http/CurlHttpClient.cs @@ -45,53 +45,59 @@ namespace NzbDrone.Common.Http Stream responseStream = new MemoryStream(); Stream headerStream = new MemoryStream(); - var curlEasy = new CurlEasy(); - curlEasy.AutoReferer = false; - curlEasy.WriteFunction = (b, s, n, o) => + using (var curlEasy = new CurlEasy()) { - responseStream.Write(b, 0, s * n); - return s * n; - }; - curlEasy.HeaderFunction = (b, s, n, o) => - { - headerStream.Write(b, 0, s * n); - return s * n; - }; - - curlEasy.UserAgent = webRequest.UserAgent; - curlEasy.FollowLocation = webRequest.AllowAutoRedirect; - curlEasy.HttpGet = webRequest.Method == "GET"; - curlEasy.Post = webRequest.Method == "POST"; - curlEasy.Put = webRequest.Method == "PUT"; - curlEasy.Url = webRequest.RequestUri.ToString(); - - if (webRequest.CookieContainer != null) - { - curlEasy.Cookie = webRequest.CookieContainer.GetCookieHeader(webRequest.RequestUri); - } + curlEasy.AutoReferer = false; + curlEasy.WriteFunction = (b, s, n, o) => + { + responseStream.Write(b, 0, s * n); + return s * n; + }; + curlEasy.HeaderFunction = (b, s, n, o) => + { + headerStream.Write(b, 0, s * n); + return s * n; + }; + + curlEasy.UserAgent = webRequest.UserAgent; + curlEasy.FollowLocation = webRequest.AllowAutoRedirect; + curlEasy.HttpGet = webRequest.Method == "GET"; + curlEasy.Post = webRequest.Method == "POST"; + curlEasy.Put = webRequest.Method == "PUT"; + curlEasy.Url = webRequest.RequestUri.ToString(); + + if (webRequest.CookieContainer != null) + { + curlEasy.Cookie = webRequest.CookieContainer.GetCookieHeader(webRequest.RequestUri); + } - if (!httpRequest.Body.IsNullOrWhiteSpace()) - { - // TODO: This might not go well with encoding. - curlEasy.PostFields = httpRequest.Body; - curlEasy.PostFieldSize = httpRequest.Body.Length; - } + if (!httpRequest.Body.IsNullOrWhiteSpace()) + { + // TODO: This might not go well with encoding. + curlEasy.PostFieldSize = httpRequest.Body.Length; + curlEasy.SetOpt(CurlOption.CopyPostFields, httpRequest.Body); + } - curlEasy.HttpHeader = SerializeHeaders(webRequest); + // Yes, we have to keep a ref to the object to prevent corrupting the unmanaged state + using (var httpRequestHeaders = SerializeHeaders(webRequest)) + { + curlEasy.HttpHeader = httpRequestHeaders; - var result = curlEasy.Perform(); + var result = curlEasy.Perform(); - if (result != CurlCode.Ok) - { - throw new WebException(string.Format("Curl Error {0} for Url {1}", result, curlEasy.Url)); - } + if (result != CurlCode.Ok) + { + throw new WebException(string.Format("Curl Error {0} for Url {1}", result, curlEasy.Url)); + } + } - var webHeaderCollection = ProcessHeaderStream(webRequest, headerStream); - var responseData = ProcessResponseStream(webRequest, responseStream, webHeaderCollection); + var webHeaderCollection = ProcessHeaderStream(webRequest, headerStream); + var responseData = ProcessResponseStream(webRequest, responseStream, webHeaderCollection); - var httpHeader = new HttpHeader(webHeaderCollection); + var httpHeader = new HttpHeader(webHeaderCollection); - return new HttpResponse(httpRequest, httpHeader, responseData, (HttpStatusCode)curlEasy.ResponseCode); + return new HttpResponse(httpRequest, httpHeader, responseData, (HttpStatusCode)curlEasy.ResponseCode); + } } }