12-7. WWWプログラミング (1) HTTP のプロトコル * HTTP( HyperText Transfer Protocol ) の仕組み 詳しくは HTTP の RFC ドキュメントをどうぞといいたいが、 実際ちょっと見たぐらいで 理解できるものでない。いわば仕様書なので文字ばかりである。HTTP 1.0 の RFC につい ては日本語訳も出ている。HTTP 1.0 では通信するのに GET, POST, HEAD という3つのメ ソッドを定義している。GET と POST は超基本なので説明記事はよく見かける。HTTP 1.1 は97年1月に出た RFC 2068 がもとになっていて、PUT とか DELETE というメソッドを 追加したことになっている。Apache はバ−ジョン 1.2 から HTTP 1.1 に対応し、これら PUT, DELETE, TRACE をサポ−トしたとある。 Netscape Enterprise Server は 3.0 から HTTP 1.1 条件付きで対応し、PUT のみサポ−トしている。 下に telnet でWWWアクセスしたところを示す。WWWブラウザがやっているのと同じ ことをシュミレ−トしているわけである。cgi-bin プログラムにアクセスする場合の GET と POST を示している。ただファイルをとってくるような場合も GET で、POST より簡単 に使える。プログラム名の後に ? で区切って、 WWWサ−バに渡す引き数を記入してい るだけである。GET, HEAD, POST などのメソッドを発行すると、WWWサ−バから結果が かえってくる。成功なら 200 である。他 300 がコンテンツ移動、400 がクライアントの エラ−、500 がサ−バのエラ−という具合である。実際はもっと細分化されていて403 が Forbiddn というように種々ある。 % telnet localhost 80 GET /cgi-bin/test.cgi?name=v1&name2=v2 HTTP/1.0 << リタ−ン。 << リタ−ン。 % telnet localhost 80 POST /cgi-bin/test.cgi HTTP/1.0 Content-Length:16 << リタ−ン。 << リタ−ン。ここ1個空行を開けること、ポイントです。 name=v1&name2=v2 << リタ−ン。ここに送りたい内容を記述する。 [ URL と URI ] 両者だいぶ混乱しているようである。URL が http://www.tcp-ip.or.jp/~ikken/int.html なら URI は /~ikken/int.html と解釈していいかと思う。 URI はWWWサ−バ上のリソ −スを特定する。下記は PHP3 のパラメ−タで URI を出してみたところである。 URL : Uniform Resource Locator URI : Universal Resource Identifier /usr/local/apache/htdocs/put.php3 これを telnet で "GET /put.php3 HTTP/1.0" と --------------------------------- アクセスすると、 | と出て来る。 * HTTP 1.1 の場合の注意 $ telnet indy2 8080 GET / HTTP/1.1 << リタ−ン。デフォルトで index.html をゲットしにいく。 HOST: indy2 << リタ−ン。またはIPアドレスを入れる。ここも入れること。 << リタ−ン。 HTTP/1.1 200 OK Date: Wed, 17 May 2000 07:39:26 GMT Server: Apache/1.3.9 (Unix) Last-Modified: Fri, 12 May 2000 07:24:23 GMT ETag: "2aaa3-8b8-391bb1a7" Accept-Ranges: bytes Content-Length: 2232 << ファイルのバイト数がでている。 Content-Type: text/html | しばらくして、5秒ぐらいでコネクションが切れる。 Connection closed by foreign host. * PUT と DELETE について HTTP でWWWサ−バにあるファイルのリストをとる。プロテクションを変更する。 消去 する。ファイル名を変更する。ファイルをアップロ−ドする。NFS の代わりに HTTP でや れないものだろうか。HTTP 1.1 はサ−バにコンテンツを送る PUT、 それにファイル消去 の DELETE をサポ−トしているとある。それなら telnet で、 とりあえず Apache 1.3.9 にアクセスして "DELETE /test.html HTTP/1.1" とかやったら消えるはずだ。それが消え ない。DELETE 自体認識してないようだ。それなら PUT はどうだ。Netscape Composer か ら HTML ファイルをアップロ−ドしてみる。これもできない。一体どうなっているのか?。 1) mode_put という Apache のモジュ−ルが PUT と DELETE をサポ−トする。デフォ ルトでは Apache には入ってない。CERN にも同様 PUT プログラムがある。 2) POST メソッドでファイルを送り込む。PHP3 を使った例がある。そりゃ POST を使 えば標準入力から送り込める。今は PUT と言うメソッドがどうか知りたいのだ。 3) httpd.conf に Script PUT /cgi-bin/put.exe というように追加する。よく分から なかった。意味がないのではないかと思う。 いろいろ検討の結果、mode_put の方法でファイルのアップロ−ドと消去ができた。 これ だけでは NFS の代わりにはならない。プロテクションやファイル名の変更は cgi-bin 経 由ということになるか。あるいは PHP3 にはそのような関数もあるから、それでもいいか も知れない。SSI( Server Side Include ) を使う手もある。 [ POST メソッドを使う ] PHP3 のマニュアルの Chapter 15.Handling file uploads、"POST method uploads" に一 応やり方が書いてある。「UNIX MAGAZINE」'97/11、P.104 にも記事があった。 まとめる とテキストでもバイナリでもいける、ファイルは相手先のテンポラリ・ディレクトリにで きるということだ。こんなような記述。 ppp.php3 ------------------------------------------------------------------- | | |Send this file: | | |?> [ Script 宣言ではどうか ] httpd.conf で "Script PUT /put.php3" とするところを PUT2 としてみた。Apache を起 動しようとすると、httpd.conf の構文がおかしい、Script 用の知らないメソッドあると エラ−が出た。一応 PUT と DELETE というメソッドが、Apache 1.3.9 の HTTP 1.1 には 有るみたいだ。しかし、この Script の記述は変だ。何もこんな風にするならただの GET で cgi-bin を使ってもいっしょじゃないか。何か意味があるのかな。 /usr/local/apache/cgi-bin/dell << 中身は何でも構わないということだよね。 ------------------------------ |#!/bin/sh |echo Content-type: text/plain |echo |echo $PATH_INFO /usr/local/apache/conf/httpd.conf --------------------------------------- | |Script DELETE /cgi-bin/dell << PUT も入れたければ同様記述する。 | | % telnet localhost 8080 DELETE /kero.doc HTTP/1.1 << HTTP 1.0 と書いてもOKだった。WWWサ−バか host: indy2 らの応答は同じく HTTP/1.1 200 OK だった。 HTTP/1.1 200 OK | (2) HTTP 経由ファイルのアップロ−ド * Apache に mod_put モジュ−ルを追加する Apache の標準モジュ−ルの中には、この mod_put モジュ−ルは入ってない。次のとこに 行って mod_put.tar.gz を取ってくる。展開するとカレントディレクトリに mod_put-1.3 というディレクトリができて、mod_put.c と mod_put.html というファイルができる。先 ずmod_put.html を見てみる。大きなセキュリティホ−ルができる可能性があるので、 注 意されたしといった英文が読める。 この mod_put.c モジュ−ルは Apache 1.2.x、1.3.x に対応していることも読める。Apache は5章で DSO 対応、それに PHP3 + PostgreSQL + XML を加えた。更に mod_put.c モジュ−ルを追加することにする。 http://hpwww.ec-lyon.fr/~vincent/apache/mod_put.html % cd /usr/local/source/apache_1.3.9 % ./configure --enable-module=so --enable-module=proxy --add-module=mod_put.c % make % make install ちゃんと追加されたか /usr/local/apache/bin/httpd -l で、mod_put.c が最後に加わっ ているか確認しておく。 make install の際 /usr/local/apache/conf に httpd.conf が あると上書きされない。しかしあらたにできる httpd.conf は特に変わりがないので、前 のを使ってもよさそうである。 /usr/local/apache/conf/httpd.conf PHP3 + PostgreSQL + XML で ------------------------------------------ 追加したようなところも示す。 | | |LoadFile /usr/local/pgsql/lib/libpq.so |LoadModule php3_module libexec/libphp3.so |Port 8080 |User katou |Group user | | | | Options Indexes FollowSymLinks << Indexes は index.html など頭のファイルが | AllowOverride None ない場合、 そのディレクトリを一覧表示する。 | Order allow,deny | Allow from all | EnablePut On << この2つ追加 | EnableDelete On << すること。 | | AuthType Basic \ | AuthName "Web publishing" |こんなようにしてアクセスできるユ−ザを制限す | AuthUserFile /www/etc/passwd |べしと mod_put.html には書いてあった。 | AuthGroupFile /www/etc/group | | |アップロ−ドしたファイルのモ−ドは、umask で | require valid-user |指定できるようだ。デフォルトは 007 である。 | / | | | |AddType application/x-httpd-php3 .php3 |AddType application/x-httpd-php3-source .phps |AddType application/x-tar .tgz |AddType text/html .shtml << この2つ SSI 用のファイル拡張子。こんなん |AddHandler server-parsed .shtml << を実行する。 | ----------------- | -------------------------------- | | ファイルの | 送信 | |開く:| http://192.9.10.1:443/dav |▼| | アイコンを | 切り取り | | -------------------------------- | 右クリック | コピ− | | 〆 Webフォルダとして開く | した画面 | ショ−トカット| | | | 削除 | | [OK] [キャンセル] [参照] | | 名前の変更 | ----------------------------------------- | プロパティ | ----------------- Windows の画面に出ているアイコンの "マイコンピュ−タ" に "Web フォルダ" ができて いた。"ネットワ−クコンピュ−タ" にも "192.9.10.1 上の dav" とできていた。これら クリックすると、上の IE ででてきた画面と同じだった。 もう一つ "マイコンピュ−タ" 画面を出し、ファイルを dav にドラッグしたらコピ−もできた。しかし、WebDAV ディレ クトリの中でファイルのコピ−/貼り付けはできなかった。 * 参考 「UNIX MAGAZINE」 2002/03, P.128〜133, "UNIX便利帖 WebDAV", Apache ヘの組込み。 > 2002/04, P.103〜108, "WebDAVクライアント", cadaver と DAV Explorer 使い方など。 「Software Design」 2001/12, P.103〜123, "WebDAV を使いこなす"。 > http://www.atmarkit.co.jp/ の記事とほぼ同じ。筆者も同じ。 http://webdav.todo.gr.jp/ WebDAV Resources JP > http://www.webdav.org/ の日本の公式サイトというべきところ。 「NETWORK MAGAZINE」2003/11, P.180〜183, Microsoft のフリ−メ−ルサ−ビス Hotmail が、Outlook や Outlook Express で送受信できるのは WebDAV と XML を使っているから。