コード例 #1
0
        public byte[] DownloadData()
        {
            Stopwatch sw = Stopwatch.StartNew();

            try
            {
                if (_currentStream == null)
                {
                    Trace.WriteLine("Connecting to " + _ip + " for " + _uri);

                    _errored                         = false;
                    _currentTcpClient                = new TcpClient();
                    _currentTcpClient.NoDelay        = true;
                    _currentTcpClient.ReceiveTimeout = 500;
                    _currentTcpClient.SendTimeout    = 500;
                    _currentTcpClient.Connect(_ip, _uri.Port);
                    _currentStream              = _currentTcpClient.GetStream();
                    _currentStream.ReadTimeout  = 500;
                    _currentStream.WriteTimeout = 500;

                    byte[] initialBuffer = Encoding.ASCII.GetBytes(string.Format(_initialRequestFormat, _uri.ToString(), _uri.Host));
                    _currentStream.Write(initialBuffer, 0, initialBuffer.Length);

                    //_readyNextRequest = Encoding.ASCII.GetBytes(string.Format(_nextRequestFormat, uri.ToString(), uri.Host));
                    _readyNextRequest = initialBuffer;
                }
                else
                {
                    _currentStream.Write(_readyNextRequest, 0, _readyNextRequest.Length);
                }

                _responseBuffer.Clear();

                int bytesRead;

                int  bytesAnalyzed;
                bool endOfHeadersReached = false;

                int    contentLength = -1;
                string httpVersion   = null;

                do
                {
                    bytesRead = _currentStream.Read(_buffer, 0, _buffer.Length);

                    _responseBuffer.AddRange(_buffer, 0, bytesRead);
                    IList <string> newHeaders = AnalyzeHeaders(_responseBuffer.GetInternalBuffer(), _responseBuffer.Count, out bytesAnalyzed, out endOfHeadersReached);

                    _responseBuffer.RemoveRange(0, bytesAnalyzed);

                    foreach (string header in newHeaders)
                    {
                        Trace.WriteLine(header);

                        if (header.StartsWith("HTTP/1"))
                        {
                            string[] splitted         = header.Split(_spaceCharArray);
                            string   httpResponseCode = splitted[1];

                            if (httpResponseCode != "200")
                            {
                                throw new InvalidDataException("httpResponseCode is " + httpResponseCode);
                            }

                            httpVersion = splitted[0];
                        }
                        else if (header.StartsWith("Content-Length:"))
                        {
                            contentLength = int.Parse(header.Split(_spaceCharArray)[1]);
                        }
                        else if (header == "Connection: keep-alive")
                        {
                            _keepAlive = true;
                        }
                        else if (header == "Connection: close")
                        {
                            _keepAlive = false;
                        }
                    }
                }while (!endOfHeadersReached);

                if (contentLength < 0 && httpVersion != "HTTP/1.0")
                {
                    throw new InvalidDataException("Content-Length is " + contentLength);
                }

                Trace.WriteLine("HTTP Version is " + httpVersion);

                if (httpVersion != "HTTP/1.0")
                {
                    while (_responseBuffer.Count < contentLength)
                    {
                        bytesRead = _currentStream.Read(_buffer, 0, _buffer.Length);
                        _responseBuffer.AddRange(_buffer, 0, bytesRead);
                    }
                }
                else
                {
                    _keepAlive = false;

                    try
                    {
                        while ((bytesRead = _currentStream.Read(_buffer, 0, _buffer.Length)) > 0)
                        {
                            _responseBuffer.AddRange(_buffer, 0, bytesRead);
                        }
                    }
                    catch (Exception)
                    {
                    }
                }

                byte[] result = _responseBuffer.ToArray();
                return(result);
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Connecting to " + _ip + " for " + _uri);
                Trace.WriteLine("Exception from " + _ip + " for " + _uri + ": " + ex.ToString());

                _errored   = true;
                _keepAlive = false;

                if (_currentStream != null)
                {
                    _currentStream.Close();
                    _currentStream = null;
                }

                if (_currentTcpClient != null)
                {
                    _currentTcpClient.Close();
                    _currentTcpClient = null;
                }

                throw;
            }
            finally
            {
                if (!_keepAlive)
                {
                    if (_currentStream != null)
                    {
                        _currentStream.Close();
                        _currentStream = null;
                    }

                    if (_currentTcpClient != null)
                    {
                        _currentTcpClient.Close();
                        _currentTcpClient = null;
                    }
                }

                Trace.WriteLine("DownloadData " + sw.Elapsed);
            }

            //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            ////request.KeepAlive = true;
            ////request.IfModifiedSince = _lastModified;

            ////request.Host = "www.oref.org.il";

            //using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            //{
            //    //_lastModified = response.LastModified;

            //    using (Stream responseStream = response.GetResponseStream())
            //    using (StreamReader reader = new StreamReader(responseStream, Encoding.Unicode))
            //    {
            //        return reader.ReadToEnd();
            //    }
            //}
        }