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);
        }
Exemple #3
0
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (checkoutCreationTask != null)
            {
                checkoutCreationTask.Cancel();
            }
            if (collectionTask != null)
            {
                collectionTask.Cancel();
            }
        }
Exemple #4
0
        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);
            }
Exemple #6
0
 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);
            }
Exemple #9
0
        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);
            }
Exemple #11
0
 public override void Cancel()
 {
     base.Cancel();
     dataTask?.Cancel();
 }