連載 / Pe 日活用のヒント て実装するか、 Net::Relay::HTTP のサプクラスとして の拡張モジュールを Net::ReIay::TCP のサプクラスとし は -http オプションを付けるかどうかではなく、 relaytcp のアクセスをシミュレートする場合である。ただし、これ Web プラウザが同一の LAN 上にある状態で、遠距離から 工をしたい場合が考えられる。たとえば、 Web サーバーと そのほか、 HTTP を中継する際に TCP 通信レベルの細 表示されるまでの時間が短い。 たびに逐次データを中継するので、ページの最初の部分が 方、—http オプションなしの場合はデータが送られてくる ページの最初の部分が表示されるまでに時間がかかる。 てを読み込んでから Web プラウザにデータを送るので、 を見る場合、 -http オプション付きだと relaytcp がすべ さらに、 web プラウザでデータサイズの大きいページ に高速なら目立って遅くなることはないのだが・ 幅に増えるのが最大の要因である。ディスク I/O が十分 られる。 -http オプション付きだと記録ファイルの数が大 に使うと、処理が目立って遅くなる場合があることが挙げ 別の要因として、 -http と -record オプションを同時 ことがなく、将来的にも正しく動作する可能性がより高い。 なる TCP 通信の中継なので HTTP の機能に左右される リスト 1 HTTP. pm 今回は、タイトルこそ前回までと違って、、 relayhttp" だ ☆ 実装するかの選択の問題である。 2 3 5 7 8 9 10 11 12 13 14 15 16 17 18 19 # (c) 2003 Morgan Stan1ey Dean Witter and Co. . /LICENSE for terms of distribution. # See package Net : :Re1ay: :HTTP; use our use our strict ; @ISA = qw(Net: :Re1ay: :TCP) ; Net : :Re1ay: :TCP qw(BLOCKSIZE my-open) ; %OPT_SPEC subcount = > [ ) S ' recordtcp = > ロ , ) NUMBER ' ] , constant DEF_SUBCOUNTINIT = > ' 00 ' ・ UNIX MAGAZINE 2004. 1 が、このプログラムは実際には relaytcp そのものといっ てもよく、じつに 4 回にわたって同じプログラムを説明し てきたことになる。 次回は、 POP (Post Office Protocol) を IMAP (ln- ternet Message Access Protocol) に変換するプログラ ム p 叩 2imap を紹介する予定である。 pop2imap を使 えば、 POP しか喋れないメール・ソフトウェアで IMAP しか喋れないメールサーバーにアクセスできる。そのよう な状況は稀だと思うので実用性には乏しいかもしれないが、 すくなくとも POP と IMAP の両方を同時に学ぶ題材に はなるだろう。こちらはさすがに relaytcp をもとに実装 しているわけではなく、まったく別のプログラムである。 ( いまづ・ひでよモルガン・スタンレー証券 ) 87
連載 / Pe 日活用のヒント HTTPHostHack.pm を参考にすれば比較的容易におこ Net: :Relay: :HTTP をもとにした relaytcp の拡張は、 されるすべてのデータに適用されている。 TCPHTTPHostHack.pm では、これらの処理が中継 ドだけに適用される。 また、 Cookie の処理がヘッダの Set-Cookie フィール ・ HTML または JavaScript であるデータ本体全体 HTTP 対応の改善の余地 なえるだろう。 86 のヘッダに Content-Length フィールドがあるので、そ HTTP. pm はこのような状況に対応していない。応答 なる。 の、、 GET" を、、 HEAD" に置き換えると HEAD 要求に だけを送るように要求するもので、 GET 要求の先頭行 体が送られてこない ( 図 9 ) 。 HEAD 要求は応答ヘッダ ンドで HEAD 要求を送ってみると、たしかにデータ本 (MUST NOT) と規定されている。実際に telnet コマ 要求に対する応答には、データ本体があってはならない HTTP の規格によれば、 HTTP 要求のなかの HEAD HEAD 要求に対する応答 会がないので対応していない。 のところ deflate で圧縮された HTTP 応答を処理する機 は de Ⅱ ate の伸張もできるようである。しかし、私はいま press : : Z ⅱ b モジュールを使っているが、このモジュールで 対応させてもよい。 relaytcp では gzip の伸張に Com- deflate を除外すれば対処できる。あるいは、 deflate に れは、 Accept-Encoding フィールドの値を書き換えて 一方、 HTTP. pm は deflate には対応していない。こ Accept—Encoding: gzip, deflate には以下のフィールドが含まれる。 これらの Web プラウザが発行する HTTP 要求のヘッダ 縮方式として gzip だけでなく deflate にも対応しており、 たとえば lnternet ExpIorer や MoziIIa は、データ圧 Content-Encoding 地がある。 HTTP. pm の HTTP の処理には以下の点で改善の余 図 9 telnet コマンドで HEAD 要求を送信した例 % telnet www. 3. org 80 Trying 18.29.1.34. Connected tO w. 3 . org. Escape character IS HEAD / HTTP/1.1 host : www. w3. org ェイ丁 HTTP/I . 1 200 OK Date: Sun, 09 Nov 2003 14 : 33 : 27 GMT Server : Apache/1.3.28 (Unix) PHP/4.2.3 Content—Location: Overview . htm1 Vary: negotiate,accept TCN: choice P3P: policyref="http: //www. w3 . org/2001/05/疇、 P3P/p3p. xml " Cache—ControI : max—age=600 Expires : Sun, 09 NOV 2003 14 : 43 : 27 GMT Last—Modified: Fri , 07 Nov 2003 19 : 24 : 56 GMT ETag: "3fabf188; 3e2eee38" Accept—Ranges : bytes Content-Length : 22090 Content—Type : text/html ; charset=utf—8 ェイ丁 のバイト数を読み込もうとしてしまう。 relay-nofork は要求に対する応答をつねに把握できる ので、対応させることは難しくない。一方、 forward では要 求と応を別のプロセスで処理しているので対応は難しい。 -http なしの HTTP の中継 -http オプションが導入されたので、 HTTP を中継す る際はつねにこのオプションを付けたほうがよいのかとい うと、そうではない場合も考えられる。 その要因として、まず—http オプションが HTTP に 完全に対応していないことが挙げられる。 HTTP の処理 のコードは私自身が数年にわたり使ってきたものだが、必 要に迫られて目的を達成できる範囲で実装しただけである。 実装する際には HTTP の規格を参照しているが、規格全 体を見渡し、 Web プラウザや Web サーバーの実装状況を 調べてから -http オプションの仕様を決めたわけではな い。したがって、前節で述べた既知の問題点があるし、実 装している機能にも不完全な部分があるかもしれない。ま た、今後おこなわれる HTTP の拡張により、 -http オプ ションで不具合が生じるようになるかもしれない。 一方、 -http オプションなしで relaytcp を使えば、たん UNIX MAGAZINE 2004. 1
SC 翡 好評発売中 ! プログラミング テクニック 連載 / Pe 日活用のヒント は意味がない。そこで、 TCP. prn の relay-nofork を 呼び出す際に、、 nofilter = 〉 1 " を指定し、フィルタを適 用しないようにしている。 もちろん、 TCP. pm の relay-nofork は、これらの引 数に対応するように前回の時点から変更されている。 324 行目 do { relay-nofork でも forward と同様に、 HTTP 応答に ついては状態コードが 1 以外で始まるものがくるまで繰 り返し読み込む。 forward でこのようにしているのは記 録ファイルの名前を要求と応答とで一致させるためで、 そうしなくても処理が滞ることはない。しかし、 relay- nofork ではこうしないと処理が滞ってしまう。 HTTPHostHack.pm relaytcp に—http と—httphosthack オプションの 両方を指定すると、 —class Net: :ReIay: :HTTPHost- Hack " を指定したのと同じになる。その際に使用される HTTPHostHack.pm を、末尾のリスト 3 に示す。 14 行目 our %OPT-SPEC = %Net::ReIay::* HTTP::OPT-SPEC; HTTP. pm 特有のコマンド行オプションを HTTP- HostHack. pm でも使えるようにするため、 14 行目で HTTP. pm の %OPT-SPEC を HTTPHostHack. pm の %OPT-SPEC にコピーしている。 req-filter メソッド 基本的には、 TCPHTTPHostHack.pm の req-filter と同じである。違いは、ヘッダの各フィールドおよびデー タ本体全体に文字列置換を適用していることである。 gzip 圧縮と塊工ンコーディングは伸張 / デコードされたうえで フィルタメソッドに渡され、ヘッダの Content-Length フィールドは適宜調整されるので、確実なフィルタ処理が おこなわれる。 res filter メソッド これも、基本的には TCPHTTPHostHack.pm の res- filter と同じである。違いの 1 つは、文字列置換が以下に 適用されることである。 ・ヘッダの各フィールド る み ド法 グクト : ・多治見寿和著 ・ B5 判、 240 ペーシ ・ ISBN 4-7561-4389- X ・ 1 , 800 円 + 税 生きたプログラムから学ぶ 実践的手法の数々 フリーの UNIX やアプリケーションのソース コードを見ながら、プログラミングにおけ る " 名匠の技 " を学ばうというのが本書の 目的です。長い年月をかけ、多くの人の手 ですこしすっ改良されてきたソフトウェア は洗練の度合いを増し、名匠の手になる工 芸品といった趣があります。そこには、プ ログラム開発に必要な技術がどっさりと盛 ( 本書より ) り込まれています。 目次から ソースコードから学ぶ◆データ構造◆ 2 重リンクリ スト◆木構造◆ AVL 木◆ハッシュ◆端末の操作◆端 末の制御◆ cat コマンド s コマンド◆ファイルの ロック◆パスワード・ファイル◆ワンタイム・バスワ ード◆公開鍵暗号◆ Secu 「 e S ⅱ e Ⅱ◆構文の解析◆ yacc ◆ lex ◆ ping ◆ telnet ◆ ftp ◆ inetd ◆ xst 「◆ cmp と cksum ◆ man ◆フィ丿レタコマンド (UNIX MAGAZINE 1997 年 1 1 月号 ~ 2000 年 3 月号より ) 株式会社アスキー 〒 1 60 ー 8584 東京都新宿区信濃町 34 J 日信濃町ビル 出版営業部電話 (03) 5362 ー 8300 85 UNIX MAGAZINE 2004. 1