void HandleClosedEvent(object sender, CFStream.StreamEventArgs e) { var stream = (CFHTTPStream)sender; // might not have been called (e.g. no data) but initialize critical data HandleHasBytesAvailableEvent(sender, e); CloseStream(stream); }
void HandleErrorEvent(object sender, CFStream.StreamEventArgs e) { var stream = (CFHTTPStream)sender; StreamBucket bucket; if (!streamBuckets.TryGetValue(stream.Handle, out bucket)) { return; } bucket.Response.TrySetException(stream.GetError()); CloseStream(stream); }
void HandleErrorEvent(object sender, CFStream.StreamEventArgs e) { var gotMutex = data_mutex.WaitOne(); if (gotMutex) { var stream = (CFHTTPStream)sender; if (e.EventType == CFStreamEventType.ErrorOccurred) { Volatile.Write(http_exception, ExceptionDispatchInfo.Capture(stream.GetError())); } data_mutex.ReleaseMutex(); } }
void HandleErrorEvent(object sender, CFStream.StreamEventArgs e) { var stream = (CFHTTPStream)sender; StreamBucket bucket; if (!streamBuckets.TryGetValue(stream.Handle, out bucket)) { return; } var ex = stream.GetError(); bucket.Response.TrySetException(new HttpRequestException(ex.FailureReason, ex)); CloseStream(stream); }
void HandleHasBytesAvailableEvent(object sender, CFStream.StreamEventArgs e) { var stream = (CFHTTPStream)sender; StreamBucket bucket; if (!streamBuckets.TryGetValue(stream.Handle, out bucket)) { return; } if (bucket.Response.Task.IsCompleted) { bucket.ContentStream.ReadStreamData(); return; } var header = stream.GetResponseHeader(); // Is this possible? if (!header.IsHeaderComplete) { throw new NotImplementedException(); } bucket.ContentStream = new CFContentStream(stream); var response_msg = new HttpResponseMessage(header.ResponseStatusCode); response_msg.RequestMessage = bucket.Request; response_msg.ReasonPhrase = header.ResponseStatusLine; response_msg.Content = bucket.ContentStream; var fields = header.GetAllHeaderFields(); if (fields != null) { foreach (var entry in fields) { if (entry.Key == null) { continue; } var key = entry.Key.ToString(); var value = entry.Value == null ? string.Empty : entry.Value.ToString(); HttpHeaders item_headers; if (IsContentHeader(key)) { item_headers = response_msg.Content.Headers; } else { item_headers = response_msg.Headers; if (cookies != null && (key == "Set-Cookie" || key == "Set-Cookie2")) { AddCookie(value, bucket.Request.RequestUri, key); } } item_headers.TryAddWithoutValidation(key, value); } } // cancellation (CancellationTokenRegistration) can happen in parallel if (!bucket.Response.Task.IsCanceled) { bucket.Response.TrySetResult(response_msg); bucket.ContentStream.ReadStreamData(); } }
void HandleClosedEvent(object sender, CFStream.StreamEventArgs e) { var stream = (CFHTTPStream)sender; CloseStream(stream); }