private void Process() { try { if (Info == null) { State = Status.GettingHeaders; GetHeaders(); aop.Post(delegate { DownloadInfoReceived.Raise(this, EventArgs.Empty); }, null); } var append = RemainingRangeStart > 0; var bytesRead = 0; var buffer = new byte[2 * 1024]; State = Status.SendingRequest; using (var response = RequestHelper.CreateRequestGetResponse(Info, RemainingRangeStart, BeforeSendingRequest, AfterGettingResponse)) { State = Status.GettingResponse; using (var responseStream = response.GetResponseStream()) using (var file = FileHelper.CheckFile(FullFileName, append)) { while (allowDownload && (bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) { State = Status.Downloading; file.Write(buffer, 0, bytesRead); TotalBytesReceived += bytesRead; speedBytesTotal += bytesRead; aop.Post(delegate { ProgressChanged.Raise(this, new ProgressChangedEventArgs(SpeedInBytes, this.Progress, TotalBytesReceived)); }, Progress); } } } if (RemainingRangeStart > Info.Length) { throw new Exception("Total bytes received overflows content length"); } if (TotalBytesReceived == Info.Length) { State = Status.Completed; DownloadCompleted.Raise(this, EventArgs.Empty); } else if (!allowDownload) { State = Status.Paused; } } catch (Exception ex) { State = Status.ErrorOccured; aop.Post(delegate { ErrorOccured.Raise(this, new ErrorEventArgs(ex)); }, null); } }
private void cd_ResponseReceived(object sender, ResponseReceivedEventArgs e) { var cd = (HttpRangeDownloader)sender; if (Info == null) { Info = HttpDownloadInfo.GetFromResponse(e.Response, Url); LastInfo = Info.Clone(); cd.Info = Info.Clone(); cd.Wait = Info.AcceptRanges; var chunkedHeader = e.Response.Headers[HttpResponseHeader.TransferEncoding]; UseChunk = Info.AcceptRanges && chunkedHeader != null && chunkedHeader.ToLower() == "chunked"; Ranges.First().End = Info.ContentSize - 1; //NofThread = Info.AcceptRanges ? NofThread : 1; DownloadInfoReceived.Raise(this, EventArgs.Empty); } if (NofActiveThreads > 1 && Info.AcceptRanges && Info.ResumeCapability != Resumeability.Yes) { Info.ResumeCapability = Resumeability.Yes; foreach (var a in cdList) { Info.AcceptRanges = true; a.Info.AcceptRanges = true; } foreach (var item in cdList.Where(x => x.Wait)) { item.Wait = false; } } if (Info.ContentSize < 10 * 1024 + 1) { foreach (var item in cdList.Where(x => x.Wait)) { item.Wait = false; } } createNewThreadIfRequired(); }
private void Process() { try { //Get the download headers if not exists if (Info == null) { State = Status.GettingHeaders; GetHeaders(); aop.Post(delegate { DownloadInfoReceived.Raise(this, EventArgs.Empty); }, null); } //Gets where download left var append = RemainingRangeStart > 0; var bytesRead = 0; var buffer = new byte[2 * 1024]; State = Status.SendingRequest; using (var response = RequestHelper.CreateRequestGetResponse(Info, RemainingRangeStart, BeforeSendingRequest, AfterGettingResponse, Info.IsChunked)) { State = Status.GettingResponse; using (var responseStream = response.GetResponseStream()) using (var file = FileHelper.CheckFile(FullFileName, append, LastMD5Checksum)) { while (allowDownload && (bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0) { State = Status.Downloading; file.Write(buffer, 0, bytesRead); TotalBytesReceived += bytesRead; speedBytesTotal += bytesRead; aop.Post(delegate { ProgressChanged.Raise(this, new ProgressChangedEventArgs(SpeedInBytes, this.Progress, TotalBytesReceived)); }, Progress); } } } if (Info.Length > 0 && RemainingRangeStart > Info.Length) { throw new Exception("Total bytes received overflows content length"); } if (TotalBytesReceived == Info.Length || (Info.Length < 1 && allowDownload)) { State = Status.Completed; DownloadCompleted.Raise(this, EventArgs.Empty); } else if (!allowDownload) { State = Status.Paused; DownloadPaused.Raise(this, EventArgs.Empty); } } catch (Exception ex) { if (TotalBytesReceived == Info.Length) { State = Status.Completed; DownloadCompleted.Raise(this, EventArgs.Empty); } else if (!allowDownload) { State = Status.Paused; DownloadPaused.Raise(this, EventArgs.Empty); } else { LastError = ex; State = Status.ErrorOccured; aop.Post(delegate { ErrorOccured.Raise(this, new ErrorEventArgs(ex)); }, null); } } finally { if (LastError == null || !(LastError is FileValidationFailedException)) { LastMD5Checksum = FileHelper.CalculateMD5(FullFileName); } } }