public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action <NSUrlSessionResponseDisposition> completionHandler) { var data = getResponseForTask(dataTask); try { if (data.CancellationToken.IsCancellationRequested) { dataTask.Cancel(); } var resp = (NSHttpUrlResponse)response; var req = data.Request; if (This.throwOnCaptiveNetwork && req.RequestUri.Host != resp.Url.Host) { throw new CaptiveNetworkException(req.RequestUri, new Uri(resp.Url.ToString())); } var content = new CancellableStreamContent(data.ResponseBody, () => { if (!data.IsCompleted) { dataTask.Cancel(); } data.IsCompleted = true; data.ResponseBody.SetException(new OperationCanceledException()); }); content.Progress = data.Progress; // NB: The double cast is because of a Xamarin compiler bug int status = (int)resp.StatusCode; var ret = new HttpResponseMessage((HttpStatusCode)status) { Content = content, RequestMessage = data.Request, }; foreach (var v in resp.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy // dictionary entries if (v.Key == null || v.Value == null) { continue; } ret.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); ret.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } // NB: The awaiting code can synchronously call read, which will block, and we'll // never get a didReceiveData, because we have not returned from DidReceiveResponse. Task.Run(() => { data.FutureResponse.TrySetResult(ret); }); } catch (Exception ex) { data.FutureResponse.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action <NSUrlSessionResponseDisposition> completionHandler) { var data = getResponseForTask(dataTask); try { if (data.CancellationToken.IsCancellationRequested) { dataTask.Cancel(); } var resp = (NSHttpUrlResponse)response; var req = data.Request; var content = new CancellableStreamContent(data.ResponseBody, () => { if (!data.IsCompleted) { dataTask.Cancel(); } data.IsCompleted = true; data.ResponseBody.SetException(new OperationCanceledException()); }); content.Progress = data.Progress; // NB: The double cast is because of a Xamarin compiler bug int status = (int)resp.StatusCode; var ret = new HttpResponseMessage((HttpStatusCode)status) { Content = content, RequestMessage = data.Request, }; ret.RequestMessage.RequestUri = new Uri(resp.Url.AbsoluteString); foreach (var v in resp.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy // dictionary entries if (v.Key == null || v.Value == null) { continue; } ret.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); ret.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } data.FutureResponse.TrySetResult(ret); } catch (Exception ex) { data.FutureResponse.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
protected override void Dispose(bool disposing) { base.Dispose(disposing); if (checkoutCreationTask != null) { checkoutCreationTask.Cancel(); } if (collectionTask != null) { collectionTask.Cancel(); } }
public async void SetupCell(MovieViewModel Movie) { Data?.Cancel(); Data = null; if (!Created) { CreateComponents(); } ImageView.Image = null; TitleLabel.Text = Movie.Title; Genres.Text = Movie.Genres; ReleaseDate.Text = Movie.ReleaseDate; var Request = NSUrlSession.SharedSession.CreateDataTaskAsync(new NSUrl(Movie.Poster), out Data); Data.Resume(); try { var Response = await Request; if (Response != null && Response.Data != null) { var Image = new UIImage(Response.Data); DispatchQueue.MainQueue.DispatchAsync(() => { ImageView.Image = Image; CurrentImage = Image; }); } } catch (Exception) { } }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action <NSUrlSessionResponseDisposition> completionHandler) { var data = getResponseForTask(dataTask); try { if (data.CancellationToken.IsCancellationRequested) { dataTask.Cancel(); } var resp = (NSHttpUrlResponse)response; var ret = new HttpResponseMessage((HttpStatusCode)resp.StatusCode) { Content = new CancellableStreamContent(data.ResponseBody, () => { //Console.WriteLine("Cancelling!"); if (!data.IsCompleted) { dataTask.Cancel(); } data.IsCompleted = true; data.ResponseBody.SetException(new OperationCanceledException()); }), RequestMessage = data.Request, }; foreach (var v in resp.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy // dictionary entries if (v.Key == null || v.Value == null) { continue; } ret.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); ret.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } data.FutureResponse.TrySetResult(ret); } catch (Exception ex) { data.FutureResponse.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action <NSUrlSessionResponseDisposition> completionHandler) { try { if (_cancelToken.IsCancellationRequested) { dataTask.Cancel(); } } catch (Exception ex) { _result.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action<NSUrlSessionResponseDisposition> completionHandler) { var data = getResponseForTask(dataTask); try { if (data.CancellationToken.IsCancellationRequested) { dataTask.Cancel(); } var resp = (NSHttpUrlResponse)response; var req = data.Request; if (This.throwOnCaptiveNetwork && req.RequestUri.Host != resp.Url.Host) { throw new CaptiveNetworkException(req.RequestUri, new Uri(resp.Url.ToString())); } var content = new CancellableStreamContent(data.ResponseBody, () => { if (!data.IsCompleted) { dataTask.Cancel(); } data.IsCompleted = true; data.ResponseBody.SetException(new OperationCanceledException()); }); content.Progress = data.Progress; // NB: The double cast is because of a Xamarin compiler bug int status = (int)resp.StatusCode; var ret = new HttpResponseMessage((HttpStatusCode)status) { Content = content, RequestMessage = data.Request, }; ret.RequestMessage.RequestUri = new Uri(resp.Url.AbsoluteString); foreach(var v in resp.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy // dictionary entries if (v.Key == null || v.Value == null) continue; ret.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); ret.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } data.FutureResponse.TrySetResult(ret); } catch (Exception ex) { data.FutureResponse.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action <NSUrlSessionResponseDisposition> completionHandler) { var inflight = GetInflightData(dataTask); if (inflight == null) { return; } try { var urlResponse = (NSHttpUrlResponse)response; var status = (int)urlResponse.StatusCode; var content = new NSUrlSessionDataTaskStreamContent(inflight.Stream, () => { if (!inflight.Completed) { dataTask.Cancel(); } inflight.Disposed = true; inflight.Stream.TrySetException(new ObjectDisposedException("The content stream was disposed.")); sessionHandler.RemoveInflightData(dataTask); }, inflight.CancellationTokenSource.Token); // NB: The double cast is because of a Xamarin compiler bug var httpResponse = new HttpResponseMessage((HttpStatusCode)status) { Content = content, RequestMessage = inflight.Request }; httpResponse.RequestMessage.RequestUri = new Uri(urlResponse.Url.AbsoluteString); foreach (var v in urlResponse.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy dictionary entries if (v.Key == null || v.Value == null) { continue; } // NSUrlSession tries to be smart with cookies, we will not use the raw value but the ones provided by the cookie storage if (v.Key.ToString() == SetCookie) { continue; } httpResponse.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); httpResponse.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } var cookies = session.Configuration.HttpCookieStorage.CookiesForUrl(response.Url); for (var index = 0; index < cookies.Length; index++) { httpResponse.Headers.TryAddWithoutValidation(SetCookie, cookies [index].GetHeaderValue()); } inflight.Response = httpResponse; // We don't want to send the response back to the task just yet. Because we want to mimic .NET behavior // as much as possible. When the response is sent back in .NET, the content stream is ready to read or the // request has completed, because of this we want to send back the response in DidReceiveData or DidCompleteWithError if (dataTask.State == NSUrlSessionTaskState.Suspended) { dataTask.Resume(); } } catch (Exception ex) { inflight.CompletionSource.TrySetException(ex); inflight.Stream.TrySetException(ex); sessionHandler.RemoveInflightData(dataTask); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void Cancel() { task.Cancel(); base.Cancel(); }
public override void DidReceiveResponse(NSUrlSession session, NSUrlSessionDataTask dataTask, NSUrlResponse response, Action<NSUrlSessionResponseDisposition> completionHandler) { var data = getResponseForTask(dataTask); try { if (data.CancellationToken.IsCancellationRequested) { dataTask.Cancel(); } var resp = (NSHttpUrlResponse)response; var ret = new HttpResponseMessage((HttpStatusCode)resp.StatusCode) { Content = new CancellableStreamContent(data.ResponseBody, () => { //Console.WriteLine("Cancelling!"); if (!data.IsCompleted) dataTask.Cancel(); data.IsCompleted = true; data.ResponseBody.SetException(new OperationCanceledException()); }), RequestMessage = data.Request, }; foreach(var v in resp.AllHeaderFields) { // NB: Cocoa trolling us so hard by giving us back dummy // dictionary entries if (v.Key == null || v.Value == null) continue; ret.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); ret.Content.Headers.TryAddWithoutValidation(v.Key.ToString(), v.Value.ToString()); } data.FutureResponse.TrySetResult(ret); } catch (Exception ex) { data.FutureResponse.TrySetException(ex); } completionHandler(NSUrlSessionResponseDisposition.Allow); }
public override void Cancel() { base.Cancel(); dataTask?.Cancel(); }