read.cgi raw modeドキュメント $Id: rawmode.txt,v 1.4 2001/11/10 07:39:07 2ch Exp $ 2001-11-10 Ver.5.26+ (5.28候補) §1. リクエストタイプおよびリクエストヘッダ リクエストタイプ GET - 本文取得のときに用いる。 HEAD - ヘッダのみを得るときに用いる。 リクエストヘッダ Accept-Encoding gzipまたはx-gzipが必要。なければエラーとなる[mod_gzipを使わない場合]。 結果はgzip圧縮されているとは限らないため、クライアントは正しくヘッダの Content-Encodingを見て圧縮されているかどうかを判断すること。 If-Modified-Since すでに取得したdatがあるのであれば、それを受信したときにヘッダにあった Last-Modifiedの値を指定すると、その後変化がないときにはHTTPのリザルトとして 304 Not Modifiedを返す。[サーバの負荷削減のために推奨する] User-Agent 存在しなければならない。 Accept-Language 存在しなければならない。 HTTPレスポンス read.cgiのレスポンスは以下のものに分類される。 200 Ok cgiが何らかのメッセージを出力するときに返す。 304 Not Modified If-Modified-Sinceにより、更新がないと判断された場合に返す。 HTTPレスポンスヘッダ Content-type text/plain Content-Encoding 圧縮されている場合、gzipまたはx-gzipで返す。圧縮されない場合はこのヘッダは 出力しない。 Content-Length 実際に出力するオクテット数を出力するが、User-Agentが"Mozilla/4."で始まり、 "compatible"が存在しない場合(つまりNetscape 4.x)このヘッダは出力しない。 §2. rawモード  read.cgiは、専用ブラウザ用に、rawパラメータの指定によっていくつかの モードがある。 ・2-0. 出力内容の書式 ・2-1. 全レス一括 ・2-2. 標準差分 ・2-3. かちゅ〜しゃDLL用差分 [5.25より] ・2-4. 範囲指定 [5.25より] ・2-5. subject.txt [5.24より] ・2-6. 複数一括処理 [5.26+より] §2-0. 出力内容の書式 rawモードの出力は、1行目にステータス行、2行目以降は.datファイルの書式で レスが必要な数、出力される。 ステータス行は、1文字目は + または - となり、以後にいくつかの単語で おおまかな内容を、以後パラメータとして詳細が記述されることもある。 データ出力(正常)系 +OK params -INCR params +PARTIAL params これらは、二行目以降に該当する.dat本文が必要なだけ出力される。 +OK: 指定された差分を正しく返す -INCR: あぼーん検出のため、全レスを返す +PARTIAL: 範囲指定による出力 またその内容を記述するparamsは空白で区切って以下のものが並ぶ。 size/maxK size: 本文の出力バイト数(0〜) max: このread.cgiにおける設定最大スレサイズ(MAX_FILESIZE)をキロバイト単位 で表した値 またさらに、TABで区切って以下のものが続く。 Range:first-last/max (範囲指定[2-4]のみ) first: 指定の開始バイト位置(0〜) last: 指定の終了バイト位置(0〜) max: このスレの現在の総バイト数(maxが0でなければlast < max) Res:first-last/max (範囲指定[2-4]のみ) first: 指定の開始レス番号(1〜) last: 指定の終了レス番号(1〜) max: このスレの現在の最終レス番号(last ≦ max) Status:status (AUTO_KAKOが有効になっている場合のみ) status: Stopped ならばストップがかかっている Location:place (AUTO_KAKOが有効になっている場合のみ) place: temp/ ならば倉庫行き前から取得 place: kako/ ならば倉庫から取得 -ERR string 1行だけで完了する。 なんかエラーが起きた。stringはエラーの内容。 日本語で書かれているため、これを処理する場合は将来の他言語版に注意が必要。 [将来的にエラーコードが付くかもしれません] "このスレッド大きすぎます。" 設定最大スレサイズ(MAX_FILESIZE)を超えている。 "そんな板orスレッドないです。" 指定された板またはスレが存在しない。 "過去ログ倉庫で発見 %s" 倉庫で発見した。 %sは相対パスで.datまたは.dat.gzの位置を表す。 "html化待ち" 倉庫待ちで発見した。場所は示さない。 "メモリの確保に失敗しました。" 内部エラー。メモリ不足。 "調整中。。。" 通常出力されることはない。 "なんか不調です。" リクエストに不備があるか、User-Agentが禁止リストに入っている。 "どこかであぼーんがあったみたいです。" あぼーん検出。 かちゅ〜しゃDLL用差分[2-3]の結果のときにのみ出力される。 §2-1. 全レス一括 書式: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=0.0 解説:  指定スレの全レスを出力する。 出力: [+OK size/maxK] [-ERR string] "このスレッド大きすぎます。" "そんな板orスレッドないです。" "過去ログ倉庫で発見 %s" %sは相対パスで.datの位置を表す。 "html化待ち" "メモリの確保に失敗しました。" "調整中。。。" "なんか不調です。" §2-2. 標準差分 書式: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=xxx.yyy 引数: xxx=取得開始レス番号(数値) yyy=その時点でのdat上のサイズ(数値, バイト単位) 解説:  rawのパラメータに指定された位置から後ろのスレだけを出力する。  ただし、指定レスが正しく指定位置で終わっていない場合、その前で あぼーんが発生したと判定し、全レス出力となる。 出力: [+OK size/maxK] [-INCR size/maxK] [-ERR string] "このスレッド大きすぎます。" "そんな板orスレッドないです。" "過去ログ倉庫で発見 %s" %sは相対パスで.datの位置を表す。 "html化待ち" "メモリの確保に失敗しました。" "調整中。。。" "なんか不調です。" リクエストにIf-Modified-Sinceが無く、 取得済みサイズとdatのファイルサイズが一致した場合、非圧縮の [+OK 0/maxK] の一行だけが返り、LastModified,Content-Length,Cotent-Encoding等は含まれない §2-3. かちゅ〜しゃDLL用差分(5.25〜) 書式: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=.yyy 引数: yyy=開始サイズ(数値, バイト単位) 解説:  rawのパラメータに指定された位置から後ろのスレだけを出力する。  ただし、その位置の直前が改行でない場合には、あぼーんと判定して エラーメッセージ "どこかであぼーんがあったみたいです。" を出力する。 コメント 標準差分よりもあぼーん判定までの負荷が低い。 かちゅ〜しゃDLL(Katjusha gzip enabler)作者のリクエストによって作成された ためこのように呼んでいるが、User-Agentに縛りはない。 出力: [+OK size/maxK] [-INCR size/maxK] [-ERR string] "このスレッド大きすぎます。" "そんな板orスレッドないです。" "過去ログ倉庫で発見 %s" %sは相対パスで.datの位置を表す。 "html化待ち" "メモリの確保に失敗しました。" "調整中。。。" "なんか不調です。" "どこかであぼーんがあったみたいです。" §2-4. 範囲指定(5.25〜) 書式1: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=0.0&st=xxx 書式2: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=0.0&to=yyy 書式3: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=0.0&st=xxx&to=yyy 書式4: http://サーバ.2ch.net/test/read.cgi/板/スレ/?raw=0.0&ls=zzz 引数: xxx=開始レス番号(1〜1001) yyy=終了レス番号(1〜1001) zzz=最新レス数(1〜1001) 出力: [+PARTIAL size/maxK] [-ERR string] "このスレッド大きすぎます。" "そんな板orスレッドないです。" "過去ログ倉庫で発見 %s" %sは相対パスで.datの位置を表す。 "html化待ち" "メモリの確保に失敗しました。" "調整中。。。" "なんか不調です。" §2-5. subject.txt (5.24〜) 書式1: http://サーバ.2ch.net/test/read.cgi/板/?raw=0.0 書式2: http://サーバ.2ch.net/test/read.cgi/板/?raw=0.0&ls=xxx (5.25〜) 書式3: http://サーバ.2ch.net/test/read.cgi/板/?raw=0.0&ls=xxx (5.25〜) 引数: xxx=取得したいレス数(最新からxxx個)  指定板のスレ一覧を取得する。圧縮が効き、個数指定ができる点で 通信量削減を狙うが、逆にサーバ負荷は高まる。 出力: [+OK size/maxK] [-ERR string] "そんな板orスレッドないです。" "メモリの確保に失敗しました。" "調整中。。。" "なんか不調です。" §2-6. 複数一括処理(5.26+) [まだfixしていません] 書式: http://サーバ.2ch.net/test/read.cgi/?raw=0.0{&dat=board/key.size} {}内は複数記述可能 引数: board=板指定 key=スレ指定 size=開始位置指定(バイト単位) 2個目以降は、同じ板ならばboardは省略可能。 差分のみに限定するため、sizeが0の場合は常に0バイト応答を行う。 解説: 複数のリクエストを一度に発行する。 出力:  各リクエストに対応して、順次連続して出力する。  各ステータス行には、正常かエラーかにかかわらず、TABで区切って以下の情報が付く。 Request:board/key.size 個々のリクエストをそのまま返す。 LastModify:time Last-Modified:で返すべき値をtime()値のまま返す。 またエラー時にはエラーメッセージの前にエラーコード値が出力される。 例: -ERR 200 そんな板orスレッド・・・ http://pc.2ch.net/test/read.cgi/tech/1002820903/109-110 109 名前:デフォルトの名無しさん 投稿日:01/10/31 17:01 マルチリクエスト、だいたいできたよ。 まだcommitしてないけど。 仕様としては、 (path)/test/read.cgi?raw=0.0&dat=board/999999999.12345&dat=board2/999888777.2345&board3/999777666.345 という形にするつもり。 同じboardが連続する時は、2番目からはboard/を省略可能とした。 レスポンスには、全体のサイズは返さず(返せない)、 +OK 1234/512K Request:board/999999999.12345 LastModify:1003111222 ・・・ +OK 0/512K Request:board2/999888777 LastModify:1000000000 +OK 4567/512K Request:board3/999777666.345 LastModify:1003222333 ・・・ が続くようにする。 "."以降を既得サイズとするが、差分に限定するため(上位50件の全取得等に使われないため)に、 ".0"は受け付けないことにした。 ただし、".0"(0以下も含む)の時はエラー扱いせずに +OK 0/512K を返すようにした。 また、Last-Modifiedはtime()の数値のまま、ヘッダの"Lastmodify:"に入れた。 それと、一応リクエスト側のことを考えて、"&dat="以下の内容を ヘッダの"Request:"にboard/key.diffの形式で入れた(boardは補完して)。 また、-ERR時に、文字列比較をしなければいけないのが疑問だったので、 この形式の時だけ、エラーコードを入れるようにした。 UA側が一通りこの形式に対応したら、 他の(rawモードの)エラーにもエラーコードを含めるようにしたい。 (その場合は、Request:やLastModify:は含まれない) 例) -ERR 200 そんな板orスレッドないです。 Request:tech/999999999.12345 -ERR 201 過去ログ倉庫で発見 ../tech/kako/100/1000000003.dat Request:tech/1000000003.123 -ERR 201 過去ログ倉庫で発見 ../tech/kako/100/1000000005.dat.gz Request:tech/1000000005.123 -ERR 202 html化待ち Request:tech/1000000001.123 -ERR 600 どこかであぼーんがあったみたいです。 Request:tech/1002820903.24646 LastModify:1004511622 110 名前:エラー長過ぎる行があります 投稿日:01/10/31 17:02 注意点としては、板別のセッティングを読みこまない(読みこめない)ので、 返される/512Kはただのデフォルト値であり信用できない、 そのため、通常の形式では読めないdatが読めてしまう可能性もある、 というのがある。 また、path形式(で板を指定)だと内部的に気持ちがよくないことが起こるので、 通常のquery_stringのみとした。 また、有効になるのは、raw=0.0で、bbs=とkey=が指定されていない時のみとした。 一括して受け付ける最大数は一応50とした。 apacheのGETリクエスト長制限とどちらが先に来るかは知らない。 とりあえず、例。 read.cgi?raw=0.0&dat=tech/1000035521.345329&dat=1002820903.24648 &dat=981726544.321672&dat=998908559.51344&dat=tech/967778156.59818 &prog/949623869.77371&dat=prog/980900290.146756&dat=1000335545.186069 &dat=unix/999166513.243075&dat=win/1003508243.184355&dat=1004351681.49566 &dat=software/1004096526.38369 +OK 0/512K Request:tech/1000035521.345329 LastModify:1004361816 +OK 680/512K Request:tech/1002820903.24648 LastModify:1004511622 ・・・ +OK 0/512K Request:tech/981726544.321672 LastModify:1004467586 +OK 0/512K Request:tech/998908559.51344 LastModify:1004177482 +OK 0/512K Request:tech/967778156.59818 LastModify:1003324384 +OK 2877/512K Request:prog/980900290.146756 LastModify:1004504546 ・・・ +OK 398/512K Request:prog/1000335545.186069 LastModify:1004511632 ・・・ +OK 1827/512K Request:unix/999166513.243075 LastModify:1004504560 ・・・ +OK 0/512K Request:win/1003508243.184355 LastModify:1004024020 +OK 2900/512K Request:win/1004351681.49566 LastModify:1004511770 ・・・ +OK 7808/512K Request:software/1004096526.38369 LastModify:1004511760 ・・・ なんかまずい点とかあったら指摘お願い。