Applied workaround for CurlSharp GC handling.

pull/3113/head
Taloth Saldono 9 years ago
parent 786e0b825a
commit 51155ba909

@ -45,53 +45,59 @@ namespace NzbDrone.Common.Http
Stream responseStream = new MemoryStream(); Stream responseStream = new MemoryStream();
Stream headerStream = new MemoryStream(); Stream headerStream = new MemoryStream();
var curlEasy = new CurlEasy(); using (var curlEasy = new CurlEasy())
curlEasy.AutoReferer = false;
curlEasy.WriteFunction = (b, s, n, o) =>
{ {
responseStream.Write(b, 0, s * n); curlEasy.AutoReferer = false;
return s * n; curlEasy.WriteFunction = (b, s, n, o) =>
}; {
curlEasy.HeaderFunction = (b, s, n, o) => responseStream.Write(b, 0, s * n);
{ return s * n;
headerStream.Write(b, 0, s * n); };
return s * n; curlEasy.HeaderFunction = (b, s, n, o) =>
}; {
headerStream.Write(b, 0, s * n);
curlEasy.UserAgent = webRequest.UserAgent; return s * n;
curlEasy.FollowLocation = webRequest.AllowAutoRedirect; };
curlEasy.HttpGet = webRequest.Method == "GET";
curlEasy.Post = webRequest.Method == "POST"; curlEasy.UserAgent = webRequest.UserAgent;
curlEasy.Put = webRequest.Method == "PUT"; curlEasy.FollowLocation = webRequest.AllowAutoRedirect;
curlEasy.Url = webRequest.RequestUri.ToString(); curlEasy.HttpGet = webRequest.Method == "GET";
curlEasy.Post = webRequest.Method == "POST";
if (webRequest.CookieContainer != null) curlEasy.Put = webRequest.Method == "PUT";
{ curlEasy.Url = webRequest.RequestUri.ToString();
curlEasy.Cookie = webRequest.CookieContainer.GetCookieHeader(webRequest.RequestUri);
} if (webRequest.CookieContainer != null)
{
curlEasy.Cookie = webRequest.CookieContainer.GetCookieHeader(webRequest.RequestUri);
}
if (!httpRequest.Body.IsNullOrWhiteSpace()) if (!httpRequest.Body.IsNullOrWhiteSpace())
{ {
// TODO: This might not go well with encoding. // TODO: This might not go well with encoding.
curlEasy.PostFields = httpRequest.Body; curlEasy.PostFieldSize = httpRequest.Body.Length;
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) if (result != CurlCode.Ok)
{ {
throw new WebException(string.Format("Curl Error {0} for Url {1}", result, curlEasy.Url)); throw new WebException(string.Format("Curl Error {0} for Url {1}", result, curlEasy.Url));
} }
}
var webHeaderCollection = ProcessHeaderStream(webRequest, headerStream); var webHeaderCollection = ProcessHeaderStream(webRequest, headerStream);
var responseData = ProcessResponseStream(webRequest, responseStream, webHeaderCollection); 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);
}
} }
} }

Loading…
Cancel
Save