システム・プログラム 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2002/2002-05-27
/http.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
表2に、HTTP で定義されている命令(メソッド)の例を示す。これらの命令 に対して、サーバは、表3に定義されたような応答を行う。
表3 HTTPで定義されている状態コードの例
-------------------------------------------------------------------- 状態コード 説明 -------------------------------------------------------------------- 200 OK(エラーなし) 301 要求されたデータが移動した 400 要求の形式にエラーがある。 404 要求されたデータが見つからない。 --------------------------------------------------------------------
たとえば、次のような URL を持つデータをアクセスすることを考える。
http://www.aaa.bbb.ac.jp:80/index.html
Mosaic などのクライアントは、まずホスト名 www.aaa.bbb.ac.jp とポート 番号 80 を使ってサーバとの間に TCP/IP の通信路を開設する。そして、クラ イアントは、開設した通信路を使って、サーバに次のような文字列を送る。
-------------------------------------------------------------------- GET /index.html HTTP/1.0←↓ ←↓ --------------------------------------------------------------------
ここで、"GET" が命令の種類、"/index.html" は、GETの引数の、要求してい るデータを表わす URL (ファイル名)、"HTTP/1.0" は、使っているプロトコル のバージョンである。次の空行は、命令のヘッダ部分の終りを意味するもので あり、必要である。「←」は、キャリッジ・リターンのコード(0x0d,C言語で' \r')、「↓」は、ニューラインのコード(0x0a,C言語で'\n')である。HTTP の ヘッダでは、行末に「←↓」を付けるように規定されている。(サーバを構築 する場合には、「←」か「↓」のどちらか1つしかこない場合でもきちんと動 作することが求められている。)
すると、サーバは、クライアントに対して次のようなデータを送り返す。(注 意:データは、常に更新されるので、必ずしもこの通りのデータが返されると は限らない。)
---------------------------------------------------------------------- HTTP/1.1 200 OK←↓ Date: Sun, 26 May 2002 16:20:16 GMT←↓ Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) DAV/1.0.2 mod_perl/1.24_01←↓ Last-Modified: Mon, 20 May 2002 03:13:08 GMT←↓ ETag: "1cc006-9be-3ce869c4"←↓ Accept-Ranges: bytes←↓ Content-Length: 2494←↓ Connection: close←↓ Content-Type: text/html←↓ ←↓ <html>↓ ↓ <head>↓ <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">↓ <title>College of Information Sciences</title>↓ </head>↓ <body>↓ ↓ <img src="fig/title.gif">↓ <P ALIGN=LEFT>[URL が http://www.coins.tsukuba.ac.jp に変更になりました。]</P>↓ ↓ ↓ ↓ <h1>目次</h1>↓ <dl><dl><dl><dl><dl>↓ <dt><img src="icon/ball_r.gif"><a href="index_1.html">↓ 情報学類とは</a>↓ ↓ ... </html>↓ ----------------------------------------------------------------------
最初の行が、状態行(status line)と呼ばれる、要求が成功したか失敗した かわ表わしている行である。"200" とは、成功したという意味である(表3参 照)。2行目から最初の空行(「←↓」だけの行)までは、これから送るデー タのメタ情報である。具体的には、データの型や、サーバのバージョン、デー タが更新された日付と時刻、バイト数などが記録されている。
最初の空行(「←↓」だけの行)の次が、データの本体である。この例では、 HTMLで記述されたデータが返されている。サーバは、データ転送が完了すると、 TCP/IP の通信路を切断する。
クライアントは、受け取ったデータを整形して利用者に対して表示する。たと えば、インライン・イメージとして指定されたデータを続けてサーバに要求し て展開したり、フォントを変えたりして表示する。
HTTPサーバ(httpd, WWWサーバ)からデータを得るプログラムを作りなさい。そ のプログラムの名前を、wcat とする。
wcat コマンドは、次のように3つの引数を与えて利用するものとする。
ここで、host は、ホスト名、port は、TCP/IP のポート番号、file は、得る べきファイル名である。これは、URL の文法で記述すると、次のようになる。-------------------------------------------------------------------- % ./wcat host port file--------------------------------------------------------------------
http://host:port/file
なお、wcat では、ポート番号の引数を省略しないものとする(省略可能なよ うに工夫してもよい)。HTTP プロトコルで用いられる標準のポート番号は、 80である。
プログラムをつくる時には、 行末の扱い(CR-LF)に注意しないさい。 余裕があれば、受け取ったデータを画面に表示する前に、Unix に合わせて行 末のキャリッジ・リターンのコードを削除するようにしなさい。