/// <summary> /// Initialize the underlying libcurl support for this EasyRequest. /// This is separated out of the constructor so that we can take into account /// any additional configuration needed based on the request message /// after the EasyRequest is configured and so that error handling /// can be better handled in the caller. /// </summary> internal void InitializeCurl() { // Create the underlying easy handle SafeCurlHandle easyHandle = Interop.Http.EasyCreate(); if (easyHandle.IsInvalid) { throw new OutOfMemoryException(); } _easyHandle = easyHandle; // Configure the handle SetUrl(); SetMultithreading(); SetTimeouts(); SetRedirection(); SetVerb(); SetVersion(); SetDecompressionOptions(); SetProxyOptions(_requestMessage.RequestUri); SetCredentialsOptions(_handler.GetCredentials(_requestMessage.RequestUri)); SetCookieOption(_requestMessage.RequestUri); SetRequestHeaders(); SetSslOptions(); }
/// <summary> /// Initialize the underlying libcurl support for this EasyRequest. /// This is separated out of the constructor so that we can take into account /// any additional configuration needed based on the request message /// after the EasyRequest is configured and so that error handling /// can be better handled in the caller. /// </summary> internal void InitializeCurl() { // Create the underlying easy handle SafeCurlHandle easyHandle = Interop.Http.EasyCreate(); if (easyHandle.IsInvalid) { throw new OutOfMemoryException(); } _easyHandle = easyHandle; // Before setting any other options, turn on curl's debug tracing // if desired. CURLOPT_VERBOSE may also be set subsequently if // EventSource tracing is enabled. if (s_curlDebugLogging) { SetCurlOption(CURLoption.CURLOPT_VERBOSE, 1L); } // Configure the handle SetUrl(); SetNetworkingOptions(); SetMultithreading(); SetTimeouts(); SetRedirection(); SetVerb(); SetVersion(); SetDecompressionOptions(); SetProxyOptions(_requestMessage.RequestUri); SetCredentialsOptions(_handler._useDefaultCredentials ? GetDefaultCredentialAndAuth() : _handler.GetCredentials(_requestMessage.RequestUri)); SetCookieOption(_requestMessage.RequestUri); SetRequestHeaders(); SetSslOptions(); }
public static extern int curl_multi_remove_handle( SafeCurlMultiHandle multi_handle, SafeCurlHandle easy_handle);
private static byte[] DownloadAsset(string uri, ref TimeSpan remainingDownloadTime) { if (remainingDownloadTime <= TimeSpan.Zero) { return(null); } List <byte[]> dataPieces = new List <byte[]>(); using (Interop.Http.SafeCurlHandle curlHandle = Interop.Http.EasyCreate()) { GCHandle gcHandle = GCHandle.Alloc(dataPieces); try { IntPtr dataHandlePtr = GCHandle.ToIntPtr(gcHandle); Interop.Http.EasySetOptionString(curlHandle, Interop.Http.CURLoption.CURLOPT_URL, uri); Interop.Http.EasySetOptionPointer(curlHandle, Interop.Http.CURLoption.CURLOPT_WRITEDATA, dataHandlePtr); Interop.Http.EasySetOptionPointer(curlHandle, Interop.Http.CURLoption.CURLOPT_WRITEFUNCTION, s_writeCallback); Interop.Http.EasySetOptionLong(curlHandle, Interop.Http.CURLoption.CURLOPT_FOLLOWLOCATION, 1L); Stopwatch stopwatch = Stopwatch.StartNew(); Interop.Http.CURLcode res = Interop.Http.EasyPerform(curlHandle); stopwatch.Stop(); // TimeSpan.Zero isn't a worrisome value on the subtraction, it only // means "no limit" on the original input. remainingDownloadTime -= stopwatch.Elapsed; if (res != Interop.Http.CURLcode.CURLE_OK) { return(null); } } finally { gcHandle.Free(); } } if (dataPieces.Count == 0) { return(null); } if (dataPieces.Count == 1) { return(dataPieces[0]); } int dataLen = 0; for (int i = 0; i < dataPieces.Count; i++) { dataLen += dataPieces[i].Length; } byte[] data = new byte[dataLen]; int offset = 0; for (int i = 0; i < dataPieces.Count; i++) { byte[] piece = dataPieces[i]; Buffer.BlockCopy(piece, 0, data, offset, piece.Length); offset += piece.Length; } return(data); }
public static extern int curl_multi_remove_handle( SafeCurlMultiHandle multi_handle, SafeCurlHandle easy_handle);