private static IObservable CreateDownloadObservable()

in ILRepack.IntegrationTests/NuGet/NuGetHelpers.cs [14:44]


        private static IObservable<byte[]> CreateDownloadObservable(Uri uri)
        {
            return Observable.Create<byte[]>(o => {
                var result = new ReplaySubject<byte[]>();
                var inner = Observable.Using(() => new WebClient(), wc => {
                    var obs = Observable
                        .FromEventPattern<
                            DownloadDataCompletedEventHandler,
                            DownloadDataCompletedEventArgs>(
                                h => wc.DownloadDataCompleted += h,
                                h => wc.DownloadDataCompleted -= h)
                        .Take(1);
                    wc.DownloadDataAsync(uri);
                    return obs;
                }).Subscribe(ep => {
                    if (ep.EventArgs.Cancelled) {
                        result.OnCompleted();
                    } else {
                        if (ep.EventArgs.Error != null) {
                            result.OnError(ep.EventArgs.Error);
                        } else {
                            result.OnNext(ep.EventArgs.Result);
                            result.OnCompleted();
                        }
                    }
                }, ex => {
                    result.OnError(ex);
                });
                return new CompositeDisposable(inner, result.Subscribe(o));
            }).Retry(5);
        }