Example #1
0
        private static void HandleAsyncException(RequestCompletionSource state, Exception ex)
        {
            if ((null == ex) && state.CancellationToken.IsCancellationRequested)
            {
                state.TrySetCanceled(state.CancellationToken);
            }
            if (null == ex)
            {
                return;
            }
            var oce = (ex as OperationCanceledException);

            if (oce != null)
            {
                // If the exception was due to the cancellation token being canceled, throw cancellation exception.
                Debug.Assert(state.CancellationToken.IsCancellationRequested);
                state.TrySetCanceled(oce.CancellationToken);
            }
            else if (ex is HttpRequestException)
            {
                state.TrySetException(ex);
            }
            else
            {
                state.TrySetException(new HttpRequestException(SR.net_http_client_execution_error, ex));
            }
        }
Example #2
0
        private async void BeginRequest(RequestCompletionSource state)
        {
            SafeCurlHandle requestHandle = new SafeCurlHandle();
            GCHandle       stateHandle   = new GCHandle();

            try
            {
                // Prepare context objects
                state.ResponseMessage = new CurlResponseMessage(state.RequestMessage);
                stateHandle           = GCHandle.Alloc(state);
                requestHandle         = CreateRequestHandle(state, stateHandle);
                state.RequestHandle   = requestHandle;

                if (state.RequestMessage.Content != null)
                {
                    Stream requestContentStream =
                        await state.RequestMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    state.RequestContentStream = requestContentStream;
                    if (state.CancellationToken.IsCancellationRequested)
                    {
                        RemoveEasyHandle(_multiHandle, stateHandle, state);
                        state.TrySetCanceled(state.CancellationToken);
                        return;
                    }
                    state.RequestContentBuffer = new byte[s_requestBufferSize];
                }

                AddEasyHandle(state);
            }
            catch (Exception ex)
            {
                RemoveEasyHandle(_multiHandle, stateHandle, state);
                HandleAsyncException(state, ex);
            }
        }
Example #3
0
        private async void BeginRequest(RequestCompletionSource state)
        {
            SafeCurlHandle requestHandle = new SafeCurlHandle();
            GCHandle       stateHandle   = new GCHandle();
            bool           needCleanup   = false;

            try
            {
                // Prepare context objects
                state.ResponseMessage = new CurlResponseMessage(state.RequestMessage);
                stateHandle           = GCHandle.Alloc(state);
                requestHandle         = CreateRequestHandle(state, stateHandle);
                state.RequestHandle   = requestHandle;
                needCleanup           = true;

                if (state.CancellationToken.IsCancellationRequested)
                {
                    state.TrySetCanceled(state.CancellationToken);
                    return;
                }

                if (state.RequestMessage.Content != null)
                {
                    Stream requestContentStream =
                        await state.RequestMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    if (state.CancellationToken.IsCancellationRequested)
                    {
                        state.TrySetCanceled(state.CancellationToken);
                        return;
                    }
                    state.RequestContentStream = requestContentStream;
                    state.RequestContentBuffer = new byte[s_requestBufferSize];
                }

                AddEasyHandle(state);
                needCleanup = false;
            }
            catch (Exception ex)
            {
                HandleAsyncException(state, ex);
            }
            finally
            {
                if (needCleanup)
                {
                    RemoveEasyHandle(_multiHandle, stateHandle, false);
                }
                else if (state.Task.IsCompleted)
                {
                    if (stateHandle.IsAllocated)
                    {
                        stateHandle.Free();
                    }
                    if (!requestHandle.IsInvalid)
                    {
                        SafeCurlHandle.DisposeAndClearHandle(ref requestHandle);
                    }
                }
            }
        }