示例#1
0
 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;
 }
示例#2
0
        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);
        }
示例#3
0
        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();
        }
示例#7
0
        /// <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);
        }
示例#8
0
        /*
         * 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);
        }
示例#9
0
        /// <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);
        }
示例#10
0
            /// <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);
        }
示例#12
0
        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);
        }
示例#13
0
 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();
     }
 }
示例#14
0
 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();
 }
示例#15
0
        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;
            }
        }
示例#16
0
        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);
        }
示例#17
0
        /// <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);
        }
示例#18
0
        /*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();
        }
示例#19
0
        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();
        }
示例#20
0
        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();
                    }
                }
            }
        }
示例#21
0
    // 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();
    }
示例#22
0
 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");
     }
 }
示例#23
0
        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);
            }
        }
示例#24
0
        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);
        }
示例#25
0
        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);
                }
        }
示例#26
0
        /// <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
示例#27
0
        /// <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;
                    }
                }
            }
        }
示例#29
0
        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);
                    }
                }
            }
        }
示例#30
0
        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();
                }
            }
        }
示例#31
0
        /// <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();
            }
        }
示例#32
0
        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;
                }
            }
        }