private static void ThrowIfCURLMError(CURLMcode error)
        {
            if (error != CURLMcode.CURLM_OK &&               // success
                error != CURLMcode.CURLM_CALL_MULTI_PERFORM) // success + a hint to try curl_multi_perform again
            {
                string msg = CurlException.GetCurlErrorString((int)error, isMulti: true);
                EventSourceTrace(msg);
                switch (error)
                {
                case CURLMcode.CURLM_ADDED_ALREADY:
                case CURLMcode.CURLM_BAD_EASY_HANDLE:
                case CURLMcode.CURLM_BAD_HANDLE:
                case CURLMcode.CURLM_BAD_SOCKET:
                    throw new ArgumentException(msg);

                case CURLMcode.CURLM_UNKNOWN_OPTION:
                    throw new ArgumentOutOfRangeException(msg);

                case CURLMcode.CURLM_OUT_OF_MEMORY:
                    throw new OutOfMemoryException(msg);

                case CURLMcode.CURLM_INTERNAL_ERROR:
                default:
                    throw new CurlException((int)error, msg);
                }
            }
        }
Exemple #2
0
        private static void ThrowIfCURLMError(CURLMcode error)
        {
            if (error != CURLMcode.CURLM_OK)
            {
                string msg = CurlException.GetCurlErrorString((int)error, true);
                VerboseTrace(msg);
                switch (error)
                {
                case CURLMcode.CURLM_ADDED_ALREADY:
                case CURLMcode.CURLM_BAD_EASY_HANDLE:
                case CURLMcode.CURLM_BAD_HANDLE:
                case CURLMcode.CURLM_BAD_SOCKET:
                    throw new ArgumentException(msg);

                case CURLMcode.CURLM_UNKNOWN_OPTION:
                    throw new ArgumentOutOfRangeException(msg);

                case CURLMcode.CURLM_OUT_OF_MEMORY:
                    throw new OutOfMemoryException(msg);

                case CURLMcode.CURLM_INTERNAL_ERROR:
                default:
                    throw new CurlException((int)error, msg);
                }
            }
        }
Exemple #3
0
            private void DeactivateActiveRequest(
                SafeCurlMultiHandle multiHandle, EasyRequest easy, 
                IntPtr gcHandlePtr, CancellationTokenRegistration cancellationRegistration)
            {
                // Remove the operation from the multi handle so we can shut down the multi handle cleanly
                CURLMcode removeResult = Interop.Http.MultiRemoveHandle(multiHandle, easy._easyHandle);
                Debug.Assert(removeResult == CURLMcode.CURLM_OK, "Failed to remove easy handle"); // ignore cleanup errors in release

                // Release the associated GCHandle so that it's not kept alive forever
                if (gcHandlePtr != IntPtr.Zero)
                {
                    try
                    {
                        GCHandle.FromIntPtr(gcHandlePtr).Free();
                        _activeOperations.Remove(gcHandlePtr);
                    }
                    catch (InvalidOperationException)
                    {
                        Debug.Fail("Couldn't get/free the GCHandle for an active operation while shutting down due to failure");
                    }
                }

                // Undo cancellation registration
                cancellationRegistration.Dispose();
            }
Exemple #4
0
 private static void ThrowIfCURLMError(CURLMcode error)
 {
     if (error != CURLMcode.CURLM_OK)
     {
         string msg = CurlException.GetCurlErrorString((int)error, true);
         VerboseTrace(msg);
         switch (error)
         {
             case CURLMcode.CURLM_ADDED_ALREADY:
             case CURLMcode.CURLM_BAD_EASY_HANDLE:
             case CURLMcode.CURLM_BAD_HANDLE:
             case CURLMcode.CURLM_BAD_SOCKET:
                 throw new ArgumentException(msg);
             case CURLMcode.CURLM_UNKNOWN_OPTION:
                 throw new ArgumentOutOfRangeException(msg);
             case CURLMcode.CURLM_OUT_OF_MEMORY:
                 throw new OutOfMemoryException(msg);
             case CURLMcode.CURLM_INTERNAL_ERROR:
             default:
                 throw new CurlException((int)error, msg);
         }
     }
 }