筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2008/No6_files/http.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2008/
http://www.coins.tsukuba.ac.jp/~yas/
表2に、HTTP で定義されている命令(メソッド)の例を示す。これらの命令 に対して、サーバは、表3に定義されたような応答を行う。
表3 HTTPで定義されている状態コードの例
状態コード 説明 -------------------------------------------------------------------- 200 OK(エラーなし) 301 要求されたデータが移動した 302 見つからない 303 別のページを見よ 304 ページは変更されていない 400 要求の形式にエラーがある 401 ページの閲覧が承認されななかった 403 アクセスが許されていない 404 要求されたデータが見つからない 501 メソッドが実装されていない
たとえば、次のような URL を持つデータをアクセスすることを考える。
http://www.aaa.bbb.ac.jp:80/index.html
Firefox などのクライアントは、まずホスト名 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: Sat, 20 May 2006 11:29:56 GMT←↓ Server: Apache/2.0.55 (Unix) PHP/4.4.2←↓ Last-Modified: Mon, 17 Apr 2006 09:38:56 GMT←↓ ETag: "12295c-4ba9-30f8ec00"←↓ Accept-Ranges: bytes←↓ Content-Length: 19369←↓ Connection: close←↓ Content-Type: text/html←↓ ←↓ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">↓ <html lang="ja">↓ <head>↓ <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">↓ <title>筑波大学第三学群情報学類</title>↓ <link href="main.css" rel="stylesheet" type="text/css">↓ <META http-equiv="Content-Script-Type" content="text/javascript">↓ <META http-equiv="Content-Style-Type" content="text/css">↓ <script type="text/javascript" src="navi.js"></script>↓ </head>↓ ↓ <body ...>↓ ...↓ </body>↓ </html>↓
最初の行が、状態行(status line)と呼ばれる、要求が成功したか失敗した かわ表わしている行である。"200" とは、成功したという意味である(表3参 照)。2行目から最初の空行(「←↓」だけの行)までは、これから送るデー タのメタ情報である。具体的には、データの型や、サーバのバージョン、デー タが更新された日付と時刻、バイト数などが記録されている。
最初の空行(「←↓」だけの行)の次が、データの本体である。この例では、 HTMLで記述されたデータが返されている。サーバは、データ転送が完了すると、 TCP/IP の通信路を切断する。
クライアントは、受け取ったデータを整形して利用者に対して表示する。たと えば、インライン・イメージとして指定されたデータを続けてサーバに要求し て展開したり、フォントを変えたりして表示する。
% telnet www.coins.tsukuba.ac.jp 80
Trying 130.158.86.207...
Connected to orchid-nwd.coins.tsukuba.ac.jp.
Escape character is '^]'.
GET /index.html HTTP/1.0
HTTP/1.1 200 OK
Date: Sat, 20 May 2006 11:29:56 GMT
Server: Apache/2.0.55 (Unix) PHP/4.4.2
Last-Modified: Mon, 17 Apr 2006 09:38:56 GMT
ETag: "12295c-4ba9-30f8ec00"
Accept-Ranges: bytes
Content-Length: 19369
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>筑波大学第三学群情報学類</title>
<link href="main.css" rel="stylesheet" type="text/css">
<META http-equiv="Content-Script-Type" content="text/javascript">
<META http-equiv="Content-Style-Type" content="text/css">
<script type="text/javascript" src="navi.js"></script>
</head>
<body ...>
...
</body>
</html>
Connection closed by foreign host.
%
wcat コマンドは、次のように3つの引数を与えて利用するものとする。
% ./wcat host port file
ここで、host は、ホスト名、port は、TCP/IP のポート番号、file は、得る
べきファイル名である。これは、URL の文法で記述すると、次のようになる。
http://host:port/file
なお、wcat では、ポート番号の引数を省略しないものとする(省略可能なよ うに工夫してもよい)。HTTP プロトコルで用いられる標準のポート番号は、 80である。
注意1:HTTP のクライアントを作成する場合、バイナリデータを扱う必要があ る。fdopen_sock() を使う場合、ヘッダについては、fprintf() やfgets() を 使ってデータを送受信してもよい。しかし、ヘッダが終わった後、本体部分で は、fwrite() や fread() を使う必要がある。
プログラム全体の構造は、次のようになる。
fread() を使う場合には、入力したバイト数(読み込んだ要素の数)を調べなさ い。また、fread() で文字列を読み込んだとしても、最後に 0 (NULL) で終端 されないので、注意しなさい。
受信した応答の本体部分は、別途ファイルに保存することが望ましい。 ヘッダと合わせて画面(標準出力)に出力してもよい。
プログラムをつくる時には、 行末の扱い(CR-LF)に注意しないさい。 余裕があれば、受け取ったデータを画面に表示する前に、Unix に合わせて行 末のキャリッジ・リターンのコードを削除するようにしなさい。