public static void InitializeRequest(HttpWebRequest request) { request.Headers.Add("aw-tenant-code", API_TENANT_CODE); request.Credentials = new NetworkCredential(USER_NAME, PASSWORD); request.KeepAlive = false; request.AddRange(1024); request.Timeout = 10000; }
protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); SetRequest?.Invoke(this, new EventArgs <HttpWebRequest>(request)); long length = _uriContexts[address].CurrentFileLength; if (length > 0) { request.AddRange(length); } _uriContexts[address].Request = request; return(request); }
protected override WebRequest GetWebRequest(Uri address) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.Expect100Continue = true; ServicePointManager.ServerCertificateValidationCallback = (Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { bool isOk = true; if (sslPolicyErrors != SslPolicyErrors.None) { for (int i = 0; i < chain.ChainStatus.Length; i++) { if (chain.ChainStatus[i].Status == X509ChainStatusFlags.RevocationStatusUnknown) { continue; } chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0); chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; bool chainIsValid = chain.Build((X509Certificate2)certificate); if (!chainIsValid) { isOk = false; break; } } } return(isOk); }; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); request.UserAgent = UserAgent.UserAgentName; request.Headers["X-HWID"] = HardwareID.FingerPrint.Value(); request.Headers["X-UserAgent"] = UserAgent.UserAgentHeaderName; request.Headers["X-GameLauncherHash"] = Value(); if (addrange != 0) { request.AddRange(addrange); } request.Proxy = null; request.Timeout = timeout; return(request); }
private static string DownloadChunk(HttpWebRequest httpWebRequest, Range readRange) { httpWebRequest.Method = "GET"; httpWebRequest.AddRange(readRange.Start, readRange.End); var tempFilePath = Path.GetTempFileName(); using (var httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse) { using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.Write)) { httpWebResponse.GetResponseStream()?.CopyTo(fileStream); } } return(tempFilePath); }
//下载文件,是一个单线程的方法,适用于小文件下载,仅支持http方式 public EnumGloabParas.EnumDownloadResult DownloadFile(string url, string path) { HttpWebRequest wReq = null; HttpWebResponse wRep = null; FileStream SaveFileStream = null; int startingPoint = 0; try { //For using untrusted SSL Certificates wReq = (HttpWebRequest)HttpWebRequest.Create(url); wReq.AddRange(startingPoint); wRep = (HttpWebResponse)wReq.GetResponse(); Stream responseSteam = wRep.GetResponseStream(); if (startingPoint == 0) { SaveFileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); } else { SaveFileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); } int bytesSize; long fileSize = wRep.ContentLength; byte[] downloadBuffer = new byte[DEF_PACKET_LENGTH]; while ((bytesSize = responseSteam.Read(downloadBuffer, 0, downloadBuffer.Length)) > 0) { SaveFileStream.Write(downloadBuffer, 0, bytesSize); } responseSteam.Dispose(); SaveFileStream.Close(); SaveFileStream.Dispose(); wRep.Close(); return(EnumGloabParas.EnumDownloadResult.Succeed); } catch (System.Exception) { return(EnumGloabParas.EnumDownloadResult.Err); } }
public static async Task RequestAsync() { int size = 1024; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://wallscloud.net/wallpaper/3d/soti/6Vqz/1366x768/download"); request.AddRange(size); HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); using (Stream stream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(stream)) { WriteLine(sr.ReadToEnd()); } } response.Close(); }
/// <summary> /// 下载文件(支持断点续传)并返回字节数组 /// </summary> /// <param name="url"></param> /// <param name="fileBytes">上次接收的文件</param> /// <returns></returns> public static byte[] DownloadFile(string url, byte[] fileBytes) { const int buffer = 32768; //32k byte[] data = new byte[buffer]; int cread; int cTotal; MemoryStream ms = fileBytes == null || fileBytes.Length == 0 ? new MemoryStream() : new MemoryStream(fileBytes); string remoteAddr = url; int fileLength = (int)ms.Length; HttpWebRequest wr = WebRequest.Create(remoteAddr) as HttpWebRequest; if (fileLength != 0) { wr.AddRange(fileLength); } try { WebResponse rsp = wr.GetResponse(); Stream st = rsp.GetResponseStream(); cTotal = (int)rsp.ContentLength; while ((cread = st.Read(data, 0, buffer)) != 0) { ms.Write(data, 0, cread); } byte[] streamArray = ms.ToArray(); ms.Dispose(); return(streamArray); } catch { } return(null); }
/* * exceptions handled properly... */ private static HttpWebRequest GetHttpWebRequest(long rangeFrom, long rangeTo, string requestUriString) { HttpWebRequest httpWebRequest = null; try { httpWebRequest = GetHttpWebRequest("GET", requestUriString); } catch (Exception exception) { throw exception; } httpWebRequest.AddRange(rangeFrom, rangeTo); return(httpWebRequest); }
/// <summary> /// 下载文件并存为内存流产 /// </summary> /// <param name="fileName"></param> /// <param name="fileBytes"></param> /// <returns></returns> private static byte[] DownloadFile(string fileName, byte[] fileBytes) { const int buffer = 32768; //32k byte[] data = new byte[buffer]; int cread; int cTotal; MemoryStream ms = fileBytes == null || fileBytes.Length == 0 ? new MemoryStream() : new MemoryStream(fileBytes); string remoteAddr = fileName.IndexOf("http://") == 0 ? fileName : string.Format("{0}/{1}", Server.UpgradeServer, fileName); int fileLength = (int)ms.Length; HttpWebRequest wr = WebRequest.Create(remoteAddr) as HttpWebRequest; if (fileLength != 0) { wr.AddRange(fileLength); } try { WebResponse rsp = wr.GetResponse(); Stream st = rsp.GetResponseStream(); cTotal = (int)rsp.ContentLength; while ((cread = st.Read(data, 0, buffer)) != 0) { ms.Write(data, 0, cread); } byte[] streamArray = ms.ToArray(); ms.Dispose(); return(streamArray); } catch { } return(null); }
/// <summary> /// Initializes the HTTP range request asynchronously. /// </summary> protected void Load_Async() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url); NetworkUtils.SetLocalEndpoint(request, _localIpAddress); request.Method = "GET"; request.KeepAlive = true; request.AllowAutoRedirect = true; request.UserAgent = _userAgent; request.AddRange(_startIndex, _endIndex - 1); IAsyncResult result = request.BeginGetResponse(OnResponseReceived, request); NetworkHelper.AddTimeout(request, result, HTTP_RANGE_REQUEST_TIMEOUT); _pendingRequest = request; _numTries++; }
/// <summary> /// Requests online resource in chunks /// </summary> /// <param name="url">URL to request</param> /// <param name="start">where to start reading</param> /// <param name="end">where to stop reading</param> /// <param name="bytestilEnd">How many bytes to read til the end (Example: If you are reading IDv1 MP3 TAG you read 128 bytes before file end)</param> /// <returns>bytearray containing the response</returns> public static byte[] Request(string url, long?start = null, long?end = null, long?bytestilEnd = null) { long filesize = 0; long Lstart = 0; if (end == null) { filesize = ResponseSize(url); } else { filesize = end.Value; } if (start == null && bytestilEnd != null) { Lstart = filesize - bytestilEnd.Value; } else { Lstart = start.Value; } byte[] responseinBytes = new byte[filesize - Lstart]; HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(url); req.Method = "GET"; if (filesize > 0) { req.AddRange(Convert.ToInt32(Lstart), Convert.ToInt32(filesize)); HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); using (Stream responseStream = resp.GetResponseStream()) { responseStream.Read(responseinBytes, 0, (int)responseinBytes.Length); } } else { responseinBytes[0] = 0; //We don't have anything to give you sorry } return(responseinBytes); }
public override int Read(byte[] buffer, int offset, int count) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.AddRange(Convert.ToInt32(position), Convert.ToInt32(position) + count); HttpWebResponse result = (HttpWebResponse)request.GetResponse(); using (Stream stream = result.GetResponseStream()) { stream.Read(buffer, offset, count); stream.Close(); } totalBytesRead += count; totalReads++; Position += count; return(count); }
void DownloadFile() { try { Thread.Sleep(500); Request = WebRequest.Create(Url) as HttpWebRequest; Request.Timeout = 5000; Request.AddRange(From, To); HttpWebResponse Response = Request.GetResponse() as HttpWebResponse; using (Stream ResponseStream = Response.GetResponseStream()) { using (Stream Stream = new FileStream(DownloadPath, FileMode.Create)) { byte[] Array = new byte[512]; int i = ResponseStream.Read(Array, 0, Array.Length); while (i > 0) { DownloadedLength += i; Stream.Write(Array, 0, i); i = ResponseStream.Read(Array, 0, Array.Length); } } } Completed = true; DownloadCompletedEvent?.Invoke(this); } catch (ThreadAbortException) { return; } catch (Exception ex) { if (ex.Message.Contains("终止") || ex.Message.Contains("内部")) { return; } if (ErrorNum >= 5) { Failed = true; DownloadFailedEvent?.Invoke(this); return; } MessageBox.Show(ex.ToString()); ErrorNum++; DownloadedLength = 0L; WorkThread = new Thread(DownloadFile); WorkThread.Start(); } }
private void Download(string filepath, string downloadUrl) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; OutputFileStream = new FileStream(filepath, FileMode.Append); Position = OutputFileStream.Position; do { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadUrl); request.ReadWriteTimeout = 5000; request.Method = "GET"; request.UserAgent = UserAgent; if (Length != 0) { request.AddRange(Position); } try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { if (Length == 0) { Length = response.ContentLength; } using (Stream dataStream = response.GetResponseStream()) { long copied = 0; byte[] buffer = new byte[1024 * 1024 * 10]; while (copied != response.ContentLength) { int size = dataStream.Read(buffer, 0, (int)buffer.Length); OutputFileStream.Write(buffer, 0, size); copied += size; Position += size; } } } } catch (WebException) { } catch (IOException) { } } while (Length == 0 || (Length != 0 && Position != Length)); OutputFileStream.Close(); }
private void Download(object obj) { Stream httpFileStream = null, localFileStram = null; try { int[] ran = obj as int[]; string tmpFileBlock = System.IO.Path.GetTempPath() + Thread.CurrentThread.Name + ".tmp"; _tempFiles.Add(tmpFileBlock); HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(_fileUrl); httprequest.AddRange(ran[0], ran[1]); HttpWebResponse httpresponse = (HttpWebResponse)httprequest.GetResponse(); httpFileStream = httpresponse.GetResponseStream(); localFileStram = new FileStream(tmpFileBlock, FileMode.Create); byte[] by = new byte[5000]; int getByteSize = httpFileStream.Read(by, 0, (int)by.Length); //Read方法将返回读入by变量中的总字节数 while (getByteSize > 0) { Thread.Sleep(20); lock (locker) _downloadSize += getByteSize; localFileStram.Write(by, 0, getByteSize); getByteSize = httpFileStream.Read(by, 0, (int)by.Length); } lock (locker) _threadCompleteNum++; } catch (Exception ex) { throw new Exception(ex.Message.ToString()); } finally { if (httpFileStream != null) { httpFileStream.Dispose(); } if (localFileStram != null) { localFileStram.Dispose(); } } if (_threadCompleteNum == _threadNum) { Complete(); _isComplete = true; } }
public static bool Download(string url, string localfile) { bool flag = false; long startPosition = 0; // 上次下载的文件起始位置 FileStream writeStream; // 写入本地文件流对象 // 判断要下载的文件夹是否存在 if (File.Exists(localfile)) { writeStream = File.OpenWrite(localfile); // 存在则打开要下载的文件 startPosition = writeStream.Length; // 获取已经下载的长度 writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件写入位置定位 } else { writeStream = new FileStream(localfile, FileMode.Create);// 文件不保存创建一个文件 startPosition = 0; } try { HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接 if (startPosition > 0) { myRequest.AddRange((int)startPosition); // 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置 } Stream readStream = myRequest.GetResponse().GetResponseStream(); // 向服务器请求,获得服务器的回应数据流 byte[] btArray = new byte[512]; // 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容 int contentSize = readStream.Read(btArray, 0, btArray.Length); // 向远程文件读第一次 while (contentSize > 0) // 如果读取长度大于零则继续读 { writeStream.Write(btArray, 0, contentSize); // 写入本地文件 contentSize = readStream.Read(btArray, 0, btArray.Length); // 继续向远程文件读取 } //关闭流 writeStream.Close(); readStream.Close(); flag = true; //返回true下载成功 } catch (Exception) { writeStream.Close(); flag = false; //返回false下载失败 } return(flag); }
/// <summary> /// 检测是否支持断点下载 /// </summary> /// <param name="url">下载文件URL</param> /// <param name="fileName">文件名包括路径</param> /// <returns></returns> private bool IsResume(string url, string fileName) { string tempFileName = fileName + ".downloading"; bool resumeDownload = false; HttpWebResponse response = null; try { HttpWebRequest request = WebRequest.Create(FileURL) as HttpWebRequest; request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"; request.AddRange(0); response = (HttpWebResponse)request.GetResponse(); // 支持Range AcceptRange = GetAcceptRanges(response); if (AcceptRange) { string lastModifiedNew = GetLastModified(response); // 获取最新的LastModified string lastModifiedOld = Util.QueryLastModified(fileName); // 获取本地的LastModified // 下载目录下,有该文件的downloading文件,且LastModified相同 if (File.Exists(tempFileName) && lastModifiedNew == lastModifiedOld) { resumeDownload = true; } else { if (!string.IsNullOrEmpty(lastModifiedNew)) { Util.CreateLastModified(fileName, lastModifiedNew); } } } } catch (Exception e) { } finally { if (response != null) { response.Close(); } } return(resumeDownload); }
/*wRequest = (HttpWebRequest)WebRequest.Create(url); * wRequest.Headers = whc; * wRequest.Host = "cdn.twist.moe"; * wRequest.Referer = $"https://twist.moe/{info.slug}"; * wRequest.AddRange(0, 999999999999); * WebResponse a = wRequest.GetResponse();*/ private void ParseMp4(M3UMP4_SETTINGS settings) { downloadRange = new int[2]; //string parsedTitle = info.title.RemoveSpecialCharacters(); wRequest = settings.GenerateWebRequest(m3u8Info[0]); wRequest.AddRange(0, 999999999999); WebResponse a = wRequest.GetResponse(); downloadRange[1] = int.Parse(a.Headers["Content-Length"]); downloadRange[0] = 0; Size = downloadRange[1]; mp4ByteStream = new MemoryStream(); if (settings.location != -1) { downloadRange[0] = settings.location; location = settings.location; } // Start thread to download file. new Thread(() => { Thread.CurrentThread.Name = "downloader"; System.IO.Stream ab; while (downloadRange[0] < downloadRange[1]) { wRequest = settings.GenerateWebRequest(m3u8Info[0]); wRequest.AddRange(downloadRange[0], downloadRange[0] + downloadAmnt); a = wRequest.GetResponse(); ab = a.GetResponseStream(); using (MemoryStream ms = new MemoryStream()) { ab.CopyTo(ms); Byte[] arr = ms.ToArray(); downloadRange[0] += arr.Length; location += arr.Length; ms.Seek(0, SeekOrigin.Begin); reset.WaitOne(); ms.CopyTo(mp4ByteStream); onNewBytes?.Invoke(arr); } } location = -99; }).Start(); }
private void Download(string filepath, string downloadUrl) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; OutputFileStream = new FileStream(filepath, FileMode.Append); Position = OutputFileStream.Position; do { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadUrl); request.Method = "GET"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"; if (Length != 0) { request.AddRange(Position); } try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (Length == 0) { Length = response.ContentLength; } Stream dataStream = response.GetResponseStream(); long copied = 0; byte[] buffer = new byte[1024 * 1024 * 10]; while (copied != response.ContentLength) { int size = dataStream.Read(buffer, 0, (int)buffer.Length); OutputFileStream.Write(buffer, 0, size); copied += size; Position += size; } response.Close(); dataStream.Close(); } catch (WebException) { Thread.Sleep(5000); } catch (IOException) { } } while (Length == 0 || (Length != 0 && Position != Length)); OutputFileStream.Close(); }
public void FileInfo() { try { HttpWebRequest request = WebRequest.CreateHttp(Url); request.AllowAutoRedirect = true; using (HttpWebResponse res = (HttpWebResponse)request.GetResponse()) { FileSize = res.ContentLength; string contentType = res.ContentType; string physicalPath = res.ResponseUri.AbsolutePath.Split('/').Last(); if (physicalPath.Contains('.')) { FileName = physicalPath; } else { FileName = physicalPath + "." + contentType.Split('/').Last(); } } } catch { FileSize = 0; HttpWebRequest fileNameReq = WebRequest.CreateHttp(Url); fileNameReq.AllowAutoRedirect = true; fileNameReq.AddRange(0, 1024); using (HttpWebResponse fileNameRes = (HttpWebResponse)fileNameReq.GetResponse()) { string contentType = fileNameRes.ContentType; string physicalPath = fileNameRes.ResponseUri.AbsolutePath.Split('/').Last(); if (physicalPath.Contains('.')) { FileName = physicalPath; } else { FileName = physicalPath + "." + contentType.Split('/').Last(); } } } }
// Token: 0x06000048 RID: 72 RVA: 0x00010978 File Offset: 0x0000EB78 public static void smethod_1(string string_0, ref long long_0, ref bool bool_0) { HttpWebRequest httpWebRequest = Class4.smethod_0(string_0); using (HttpWebResponse response = httpWebRequest.GetResponse2()) { long_0 = response.ContentLength; } httpWebRequest.Abort(); httpWebRequest = Class4.smethod_0(string_0); httpWebRequest.AddRange(0L, long_0 / 2L); using (HttpWebResponse response2 = httpWebRequest.GetResponse2()) { bool_0 = (response2.ContentLength == long_0 / 2L + 1L); response2.Close(); } httpWebRequest.Abort(); }
private void CreateRequestAndResponse() { request = HU.Create(URL, Data); //从当前位置开始下载 request.AddRange(CurrPostion); response = (HttpWebResponse)request.GetResponse(); //if (response.StatusCode != HttpStatusCode.OK)//未请求成功 // throw new HttpListenerException(T.ToInt(response.StatusCode), HU.GetResponseStreamData(response)); if (string.IsNullOrWhiteSpace(response.Headers["Content-Disposition"])) { //不是一个文件 throw new Exception("this url is not a file"); } if (response.ContentLength == 0)//空文件 { throw new Exception("empty file"); } }
public static async Task <bool> TeskAsync(HttpParams hp) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(hp.Url); request.AddRange(1); try { HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); request.Abort(); response.Close(); return(true); } catch { return(false); } }
public static HttpWebRequest getWebRequest(string url, int startPos) { HttpWebRequest request = null; try { request = (HttpWebRequest)HttpWebRequest.Create(url); request.AddRange(startPos); //设置Range值 } catch (Exception ex) { UnityEngine.Debug.LogException(ex); } return(request); }
public Stream OpenDataFile(IndexEntry entry) { var archive = config.Archives[entry.Index]; string file = config.CDNPath + "/data/" + archive.Substring(0, 2) + "/" + archive.Substring(2, 2) + "/" + archive; Stream stream = CDNCache.Instance.OpenFile(file, true); if (stream != null) { stream.Position = entry.Offset; MemoryStream ms = new MemoryStream(entry.Size); stream.CopyBytes(ms, entry.Size); ms.Position = 0; return(ms); } //using (HttpClient client = new HttpClient()) //{ // client.DefaultRequestHeaders.Range = new RangeHeaderValue(entry.Offset, entry.Offset + entry.Size - 1); // var resp = client.GetStreamAsync(url).Result; // MemoryStream ms = new MemoryStream(entry.Size); // resp.CopyBytes(ms, entry.Size); // ms.Position = 0; // return ms; //} string url = "http://" + config.CDNHost + "/" + file; HttpWebRequest req = WebRequest.CreateHttp(url); //req.Headers[HttpRequestHeader.Range] = string.Format("bytes={0}-{1}", entry.Offset, entry.Offset + entry.Size - 1); req.AddRange(entry.Offset, entry.Offset + entry.Size - 1); using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse()) using (Stream respStream = resp.GetResponseStream()) { MemoryStream ms = new MemoryStream(entry.Size); respStream.CopyBytes(ms, entry.Size); ms.Position = 0; return(ms); } }
/// <summary> /// //接收数据线程 /// </summary> /// <param name="ThreadId"></param> public void OnReceive(object obj) { int threadId = ThreadId; string filename = dataObj.FileNames[threadId]; //线程临时文件 byte[] buffer = new byte[dataObj.BufferSize]; // 接收缓冲区 int readSize = 0; // 接收字节数 FileStream fs = new FileStream(filename, System.IO.FileMode.Create); Stream ns = null; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(dataObj.Url); request.AddRange(dataObj.StartPos[threadId], dataObj.StartPos[threadId] + dataObj.FileSizes[threadId]); //请求添加范围 ns = request.GetResponse().GetResponseStream(); //获得流 //第一次读 如果读到就继续读,读不到才退出 readSize = ns.Read(buffer, 0, dataObj.BufferSize); dataObj.bytesCopiedLength += readSize; dataObj.byteCopiedQueue.Enqueue(dataObj.bytesCopiedLength); //通过线程同步,同时运行的线程数量和CPU逻辑处理器相同 dataObj.threadSeam.WaitOne(); while (readSize > 0) { //写入临时文件 fs.Write(buffer, 0, readSize); lock (syncObject) { dataObj.bytesCopiedLength += readSize; dataObj.byteCopiedQueue.Enqueue(dataObj.bytesCopiedLength); } readSize = ns.Read(buffer, 0, dataObj.BufferSize); } fs.Close(); ns.Close(); } catch (Exception er) { downloadProgress(0, 0, HttpClientHelper.HttpDownloadState.ERROR, er.ToString()); fs.Close(); } dataObj.threadSeam.Release();//退出信号量 //线程停止调用合并文件 dataObj.MergeFile(); } //end OnReceive
/// <summary> /// 向服务器发送get请求 返回服务器回复数据 /// </summary> /// <param name="url"></param> /// <returns></returns> public static byte[] Get(string url, bool video = false) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "get"; if (video) { //request.Headers = webHeaderCollection; //request.Headers.Add(HttpRequestHeader.Range, "bytes=0-"); //request.AddRange(0, 1048575); request.AddRange(0); } if (CookiesContainer == null) { CookiesContainer = new CookieContainer(); } request.CookieContainer = CookiesContainer; //启用cookie HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream response_stream = response.GetResponseStream(); int count = (int)response.ContentLength; int offset = 0; byte[] buf = new byte[count]; while (count > 0) //读取返回数据 { int n = response_stream.Read(buf, offset, count); if (n == 0) { break; } count -= n; offset += n; } return(buf); } catch { return(null); } }
private void DownloadThread(object sender, DoWorkEventArgs e) { ModDownloadInfo MDI = (ModDownloadInfo)e.Argument; int RetryCounter = 0; while (RetryCounter <= 5 && !threadPermFail) { try { HttpWebRequest hRequest = WebRequest.CreateHttp(MDI.url); hRequest.AddRange(MDI.startPosition, MDI.startPosition + MDI.Length); WebResponse hResp = hRequest.GetResponse(); Stream nStream = hResp.GetResponseStream(); byte[] b = new byte[hResp.ContentLength]; Debug.WriteLine(MDI.startPosition + " " + MDI.Length + " " + hResp.ContentLength); nStream.Read(b, 0, (int)hResp.ContentLength); if (MDI.Length > hResp.ContentLength) { Array.Resize(ref b, MDI.Length); for (int i = 0; i < MDI.Length - hResp.ContentLength; i++) { b[hResp.ContentLength + i] = 0; } } MemoryStream mstmp = new MemoryStream(b); //nStream.CopyTo(mstmp); DownloadedData.Add(MDI.startPosition, mstmp); // DownloadedBytes += MDI.Length + 1; return; } catch (Exception ex) { RetryCounter++; if (RetryCounter > 5) { threadPermFail = true; //Logger.Error(ex.Message + "\r\nThread: " + MDI.url +", start at " + MDI.startPosition); return; } } } }
private static HttpWebResponse HttpWebResponse(string url, string method = "GET", int?from = null, int?to = null, int numRetries = 0) { if (numRetries >= 5) { Logger.WriteLine($"Utils: HttpWebResponse for {url} failed after 5 tries"); return(null); } HttpWebRequest req = WebRequest.CreateHttp(url); req.Method = method; if (method == "GET") { req.ReadWriteTimeout = 15000; if (from.HasValue && to.HasValue) { req.AddRange(from.Value, to.Value); } } HttpWebResponse resp; try { return((HttpWebResponse)req.GetResponse()); } catch (WebException exc) { using (resp = (HttpWebResponse)exc.Response) { if (exc.Status == WebExceptionStatus.ProtocolError && (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == (HttpStatusCode)429)) { return(HttpWebResponse(url, method, from, to, numRetries + 1)); } else { Logger.WriteLine($"Utils: error at HttpWebResponse {url}: Status {exc.Status}, StatusCode {resp.StatusCode}"); return(null); } } } }
public void DownloadChunk(long chunkId) { long chunkStart = ChunkSize * chunkId; long chunkEnd = Math.Min(chunkStart + ChunkSize - 1, TotalSize); long chunkDownloaded = File.Exists(ChunkTarget(chunkId)) ? new FileInfo(ChunkTarget(chunkId)).Length : 0; chunkStart += chunkDownloaded; ChunkProgress[chunkId] = chunkDownloaded; if (chunkStart < chunkEnd) { HttpWebRequest dwnlReq = WebRequest.CreateHttp(ChunkSource); dwnlReq.AllowAutoRedirect = true; dwnlReq.AddRange(chunkStart, chunkEnd); dwnlReq.ServicePoint.ConnectionLimit = 100; dwnlReq.ServicePoint.Expect100Continue = false; try { using (HttpWebResponse dwnlRes = (HttpWebResponse)dwnlReq.GetResponse()) using (Stream dwnlSource = dwnlRes.GetResponseStream()) using (FileStream dwnlTarget = new FileStream(ChunkTarget(chunkId), FileMode.Append, FileAccess.Write)) { int bufferedSize; byte[] buffer = new byte[CHUNK_BUFFER_SIZE]; do { Task <int> bufferReader = dwnlSource.ReadAsync(buffer, 0, CHUNK_BUFFER_SIZE); bufferReader.Wait(); bufferedSize = bufferReader.Result; Interlocked.Add(ref ChunkProgress[chunkId], bufferedSize); dwnlTarget.Write(buffer, 0, bufferedSize); } while (bufferedSize > 0); } } finally { dwnlReq.Abort(); } } }
/// <summary> /// 以断点续传方式下载文件 /// </summary> /// <param name="strFileName">下载文件的保存路径</param> /// <param name="strUrl">文件下载地址</param> public void DownloadFile(string strFileName, string strUrl) { //打开上次下载的文件或新建文件 long SPosition = 0; FileStream FStream; if (File.Exists(strFileName)) { FStream = File.OpenWrite(strFileName); SPosition = FStream.Length; FStream.Seek(SPosition, SeekOrigin.Current);//移动文件流中的当前指针 } else { FStream = new FileStream(strFileName, FileMode.Create); SPosition = 0; } //打开网络连接 try { HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl); if (SPosition > 0) { myRequest.AddRange((int)SPosition);//设置Range值 } //向服务器请求,获得服务器的回应数据流 Stream myStream = myRequest.GetResponse().GetResponseStream(); byte[] btContent = new byte[512]; int intSize = 0; intSize = myStream.Read(btContent, 0, 512); while (intSize > 0) { FStream.Write(btContent, 0, intSize); intSize = myStream.Read(btContent, 0, 512); } FStream.Close(); myStream.Close(); MessageBox.Show("文件下载完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch { FStream.Close(); } }
private static void SetRequestHeaders(HttpWebRequest webRequest, HttpRequestMessage request) { WebHeaderCollection webRequestHeaders = webRequest.Headers; HttpRequestHeaders headers = request.Headers; // Most headers are just added directly to HWR's internal headers collection. But there are some exceptions // requiring different handling. // The following bool vars are used to skip string comparison when not required: E.g. if the 'Host' header // was not set, we don't need to compare every header in the collection with 'Host' to make sure we don't // add it to HWR's header collection. bool isHostSet = headers.Contains(HttpKnownHeaderNames.Host); bool isExpectSet = headers.Contains(HttpKnownHeaderNames.Expect); bool isTransferEncodingSet = headers.Contains(HttpKnownHeaderNames.TransferEncoding); bool isConnectionSet = headers.Contains(HttpKnownHeaderNames.Connection); bool isAcceptSet = headers.Contains(HttpKnownHeaderNames.Accept); bool isDateSet = headers.Contains(HttpKnownHeaderNames.Date); bool isIfModifiedSinceSet = headers.Contains(HttpKnownHeaderNames.IfModifiedSince); bool isRangeSet = headers.Contains(HttpKnownHeaderNames.Range); bool isRefererSet = headers.Contains(HttpKnownHeaderNames.Referer); bool isUserAgentSet = headers.Contains(HttpKnownHeaderNames.UserAgent); if (isHostSet) { string host = headers.Host; if (host != null) { webRequest.Host = host; } } if (isDateSet) { DateTimeOffset? date = headers.Date; if (date != null) { webRequest.Date = date.Value.Date; } } if (isIfModifiedSinceSet) { DateTimeOffset? ifModifiedSince = headers.IfModifiedSince; if (ifModifiedSince != null) { webRequest.IfModifiedSince = ifModifiedSince.Value.Date; } } if (isRangeSet) { RangeHeaderValue range = headers.Range; if (range != null) { foreach(var rangeItem in range.Ranges) { webRequest.AddRange((long) rangeItem.From, (long) rangeItem.To); } } } if (isRefererSet) { Uri referer = headers.Referrer; if (referer != null) { webRequest.Referer = referer.OriginalString; } } // The following headers (Expect, Transfer-Encoding, Connection) have both a collection property and a // bool property indicating a special value. Internally (in HttpHeaders) we don't distinguish between // "special" values and other values. So we must make sure that we add all but the special value to HWR. // E.g. the 'Transfer-Encoding: chunked' value must be set using HWR.SendChunked, whereas all other values // can be added to the 'Transfer-Encoding'. The collection property (headers.Expect, headers.Connection, // headers.TransferEncoding) only return non-special values. if (isExpectSet && (headers.Expect.Count > 0)) { webRequest.Expect = GetValueString(headers.Expect); } if (isTransferEncodingSet && (headers.TransferEncoding.Count > 0)) { webRequest.TransferEncoding = GetValueString(headers.TransferEncoding); } if (isConnectionSet && (headers.Connection.Count > 0)) { webRequest.Connection = GetValueString(headers.Connection); } if (isAcceptSet && (headers.Accept.Count > 0)) { webRequest.Accept = GetValueString(headers.Accept); } if (isUserAgentSet && headers.UserAgent.Count > 0) { webRequest.UserAgent = GetValueString(headers.UserAgent); } foreach (var header in request.Headers.GetHeaderStrings()) { string headerName = header.Key; if ((isHostSet && AreEqual(HttpKnownHeaderNames.Host, headerName)) || (isExpectSet && AreEqual(HttpKnownHeaderNames.Expect, headerName)) || (isTransferEncodingSet && AreEqual(HttpKnownHeaderNames.TransferEncoding, headerName)) || (isConnectionSet && AreEqual(HttpKnownHeaderNames.Connection, headerName)) || (isAcceptSet && AreEqual(HttpKnownHeaderNames.Accept, headerName)) || (isDateSet && AreEqual(HttpKnownHeaderNames.Date, headerName)) || (isIfModifiedSinceSet && AreEqual(HttpKnownHeaderNames.IfModifiedSince, headerName)) || (isRangeSet && AreEqual(HttpKnownHeaderNames.Range, headerName)) || (isRefererSet && AreEqual(HttpKnownHeaderNames.Referer, headerName)) || (isUserAgentSet) && AreEqual(HttpKnownHeaderNames.UserAgent, headerName)) { continue; // Header was already added. } webRequestHeaders.Add(header.Key, header.Value); } }
private static void AddRequestHeaders(HttpWebRequest request, HttpRequestHeaders headers) { foreach (var header in headers) { switch (header.Key.ToLowerInvariant ()) { case "accept": request.Accept = headers.Accept.ToString (); break; case "connection": request.Connection = headers.Connection.ToString (); break; case "date": // .NET 3.5 does not expose a property for setting this reserved header goto default; case "expect": request.Expect = headers.Expect.ToString (); break; case "host": // .NET 3.5 does not expose a property for setting this reserved header goto default; case "if-modified-since": request.IfModifiedSince = headers.IfModifiedSince.Value.UtcDateTime; break; case "range": foreach (var range in headers.Range.Ranges) { checked { if (!string.IsNullOrEmpty(headers.Range.Unit)) { if (range.To.HasValue) request.AddRange (headers.Range.Unit, (int) range.From.Value, (int) range.To.Value); else request.AddRange (headers.Range.Unit, (int) range.From.Value); } else { if (range.To.HasValue) request.AddRange ((int) range.From.Value, (int) range.To.Value); else request.AddRange ((int) range.From.Value); } } } break; case "referer": request.Referer = headers.Referrer.OriginalString; break; case "transfer-encoding": request.TransferEncoding = headers.TransferEncoding.ToString (); break; case "user-agent": request.UserAgent = headers.UserAgent.ToString (); break; default: foreach (var value in header.Value) { request.Headers.Add (header.Key, value); } break; } } }