Ejemplo n.º 1
0
        private bool IsServerChanged(ThreadHeader h)
        {
            X2chServerTracer server = new X2chServerTracer();

            if (server.Trace(h.BoardInfo, true))
            {
                h.BoardInfo = server.Result;
                return(true);
            }


            return(false);
        }
        /// <summary>
        /// 板を開く
        /// </summary>
        /// <param name="info"></param>
        public override bool Open(BoardInfo info)
        {
            if (info == null)
            {
                throw new ArgumentNullException("info");
            }
            if (isOpen)
            {
                throw new InvalidOperationException("既にストリームが開かれています");
            }

Redirect:
            // 板の移転チェック
            bool trace = false;

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(info.Url + "subject.txt");

            req.Timeout           = 30000;
            req.UserAgent         = UserAgent;
            req.AllowAutoRedirect = false;
            req.Headers.Add("Accept-Encoding", "gzip");

            req.Headers.Add("Pragma", "no-cache");
            req.Headers.Add("Cache-Control", "no-cache");

            _res = (HttpWebResponse)req.GetResponse();

            //IAsyncResult ar = req.BeginGetResponse(null, null);
            //if (!ar.IsCompleted)
            //{
            //    if (canceled)
            //    {
            //        req.Abort();
            //        return false;
            //    }
            //    Thread.Sleep(100);
            //}

            //_res = (HttpWebResponse)req.EndGetResponse(ar);

            baseStream = _res.GetResponseStream();

            boardinfo = info;

            // Subject.txtが取得できてContent-Lengthが0、
            // またはStatusCodeがFoundの場合は板が移転したかも
            if (_res.StatusCode == HttpStatusCode.OK)
            {
                position = 0;
                length   = (int)_res.ContentLength;
                isOpen   = true;

                if (_res.ContentEncoding.EndsWith("gzip"))
                {
                    using (GZipStream gzipInp = new GZipStream(baseStream, CompressionMode.Decompress))
                        baseStream = FileUtility.CreateMemoryStream(gzipInp);

                    length = (int)baseStream.Length;
                }

                if (length == 0)
                {
                    trace = true;
                }
            }
            else
            {
                if (_res.StatusCode == HttpStatusCode.Found)
                {
                    trace = true;
                }
                _res.Close();
                _res = null;
            }

            if (trace)
            {
                // 板移転の可能性
                X2chServerTracer tracer = new X2chServerTracer();
                if (tracer.Trace(boardinfo, true))
                {
                    BoardInfo newbrd = tracer.Result;
                    OnServerChange(new ServerChangeEventArgs(boardinfo, newbrd, tracer.TraceList));

                    if (AutoRedirect)
                    {
                        info = newbrd;

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

                        goto Redirect;
                    }
                }
            }

            return(isOpen);
        }