2ちゃんねる用ブラウザ「twintail」Part28

このエントリーをはてなブックマークに追加
589水玉 ◆qHK1vdR8FRIm
>>331-344
が水玉カスタム(2.3.6ベース)でも再現できたので調査しました。
ch2Solution\twin\Bbs\X2ch\X2chThreadReader.cs:Read(ResSetCollection resSets, out int byteParsed)
にてループしていることを発見。

      // バッファにデータを読み込む
      int byteCount = baseStream.Read(buffer, 0, buffer.Length);

      // あぼーんチェック
      if (aboneCheck && byteCount > 0)
      {
        if (buffer[0] != '\n')
        {
          OnABone();
          byteParsed = 0;

ざっくりいうと、
 「あぼ〜ん」検出時に既得分を再取得してパースし直したものを既得として、そのバイト数からの
 差分リクエストを行っているが、サーバー側のdatが想定外(仕様違い、破損その他で)なため
 何度も「あぼ〜ん」検出されてしまう
のでした。
590水玉 ◆qHK1vdR8FRIm :2011/12/15(木) 22:01:01.21 ID:JYc9UzGj0
対応としては、スレッドパーサー/フォーマッターを修正するのは2ちゃんの仕様変更や2ちゃん型
外部BBSへの対応を考えると得策ではないし、この(見た目)不正datを新規取得したあとでは
問題は起きない(再度あぼ〜んしなければ)ので、
現状でも取り立てて実害ないことから、手動再取得とする仕様でかまわないと思います。

再度あぼ〜んした場合でも対応できる方法としては、
再リクエストの際のバイト数をdat再パースで求めるのではなく、
1レス1行であることを前提として既得レス数までの再取得dat行から再リクエストバイト数を求めれば、
(ある程度までの)仕様違いや破損datでも対応可能と考えられます。

ちなみに仕様違いのレス例)
http://kilauea.bbspink.com/test/read.cgi/ascii/1320934883/52
> 52 :うふ〜ん:うふ〜ん ID:DELETED
> うふ〜ん

本件、>>407,408,585を調査中にあぼ〜ん問題に行き当たっちゃったのでした。
コンマアンカー問題は水玉カスタムでは再現しないのですがsrc2732では再現して、
ch2Solution\twin\Tools\ResReference.csにて「+」に追加対応した際正規表現を若干変更したのが
どうも原因ぽい所まで追いました。
今あぼ〜ん問題が何度でも再現できる状態を確保するため他の事ができなくなってます。・゚・(ノ∀`)・゚・。