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)); } }
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); } }
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); } } } }