[BlueLeaf1336]> PROGRAM>

WEBサーバを作ろう-002

historyTOP

2003/08/05:作成

referenceTOP

C/C++300の技(以下テキストと呼称する)

overviewTOP

無謀にもWEBサーバです。しかも第2話。第1話はWEBサーバを作ろう-001になっています。

P50:082 WEBサーバが送信するデータとは?TOP

前回作成したプログラム(多分どれでもよいのですがたとえば20030731client057.zip)は、クライアントモードでは

'GET /index.html HTTP/1.0'#13#10#13#10     ※「#13#10」は「CRLF」です
を指定したサーバに向けて送信し、応答を受信します。
さて、じゃあ本物のWEBサーバはどんな応答を返すんでしょうか。やってみましょう。
※LINKページの上から順にサーバ名っぽいところを取り出しただけです。他意はありません。

www.ntt.com

HTTP/1.1 200 OK
Server: Netscape-Enterprise/3.6 SP3
Date: Tue, 05 Aug 2003 13:08:11 GMT
RequestStartSec: 1060088892
RequestStartUsec: 492613
Content-type: text/html
Set-Cookie: AnalysisUserId=220.16.209.78:47841060088892; EXPIRES=Friday, 31-Dec-2010 23:59:59 GMT; PATH=/
Last-modified: Fri, 01 Aug 2003 18:00:14 GMT
Content-length: 22772
Accept-ranges: bytes
Connection: close

<html>...

provider.bb.yahoo.co.jp

HTTP/1.1 200 OK
Date: Tue, 05 Aug 2003 13:09:34 GMT
Cache-Control: private
Expires: Thu, 05 Jan 1995 22:00:00 GMT
Pragma: no-cache
Connection: close
Content-Type: text/html;charset=euc-jp
Set-Cookie: B=1uitkqcvivb4e&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp

<html>...

www.eonet.ne.jp

HTTP/1.0 200 OK
Server: Netscape-Enterprise/4.1
Date: Tue, 05 Aug 2003 13:10:02 GMT
Content-type: text/html
Last-modified: Mon, 21 Apr 2003 11:57:08 GMT
Content-length: 3046
Accept-ranges: bytes
Connection: close

<html>...

homepage2.nifty.com

HTTP/1.1 404 Not found
Server: Zeus/3.4
Date: Tue, 05 Aug 2003 13:10:37 GMT
Connection: close
Content-Type: text/html

<HTML>...

www.borland.co.jp

HTTP/1.1 200 OK
Date: Tue, 05 Aug 2003 13:10:30 GMT
Server: Apache/1.3.9 (Unix)
Connection: close
Content-Type: text/html

<HTML>...

forum.nifty.com

HTTP/1.1 200 OK
Server: Netscape-Enterprise/4.1
Date: Tue, 05 Aug 2003 13:13:20 GMT
Content-type: text/html
Last-modified: Thu, 05 Sep 2002 04:53:54 GMT
Content-length: 181
Accept-ranges: bytes
Connection: close

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">...

www.asahi-net.or.jp

HTTP/1.1 302 Found
Date: Tue, 05 Aug 2003 13:12:55 GMT
Server: Apache/1.3.27 (Unix)
Location: http://www.asahi-net.or.jp/
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">...

halbow.cool.ne.jp

HTTP/1.1 200 OK
Date: Tue, 05 Aug 2003 13:12:14 GMT
Server: Apache/1.3.26 (Unix)
Last-Modified: Tue, 27 Feb 2001 15:25:55 GMT
ETag: "21810c-95-3a9bc703"
Accept-Ranges: bytes
Content-Length: 149
Connection: close
Content-Type: text/html

<html>...

www.wwlnk.com

HTTP/1.1 404 Not Found
Date: Tue, 05 Aug 2003 13:12:09 GMT
Server: Apache/1.3.26 (Unix) FrontPage/4.0.4.3
Last-Modified: Thu, 13 Jul 2000 03:28:21 GMT
ETag: "98003-85-396d3755"
Accept-Ranges: bytes
Content-Length: 133
Connection: close
Content-Type: text/html

<head>...

hp.vector.co.jp

HTTP/1.1 302 Found
Date: Tue, 05 Aug 2003 13:11:17 GMT
Server: Apache/2.0.45 (Unix)
Location: http://www.vector.co.jp/index.html
Content-Length: 218
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">...

Apache率高いですね。 それはそれとしてテキストによるとWEBサーバの応答は、「応答コード」・「ヘッダ部」・「ボディ部」に分けられます。

たとえば、www.google.co.jpの応答は次のようなものですが(googleにはindex.htmlは無いんでしょうね)、このうちHTTP/1.0 302 Foundが応答コードで、Connection...206がヘッダ部、そして空行があって、通常のHTMLコードのボディ部に続きます

HTTP/1.0 302 Found
Connection: Keep-Alive
Date: Tue, 05 Aug 2003 13:18:36 GMT
Set-Cookie: PREF=ID=7a9e046008b8f78a:CR=1:TM=1060089516:LM=1060089516:S=CTd_bSTo7MDOXHEw; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Location: http://www.google.co.jp/cxfer?c=PREF%3D:TM%3D1060089516:S%3D9EnYyhjjp6q1dKty
Content-Type: text/html
Server: GWS/2.1
Content-length: 206

<HTML><HEAD><TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/cxfer?c=PREF%3D:TM%3D1060089516:S%3D9EnYyhjjp6q1dKty">here</A>.
</BODY></HTML>

つまり、これに類する応答を返せばそれっぽいということになります。

P50:084 実際のブラウザからのリクエストは?TOP

WEBサーバが返すべき内容がだいたいわかったら、次はクライアントがどのようなリクエストを投げるか?です。 最初の方のサーバプログラム(20030731server058.zip)で、実は表示したことがあるので、もう一度そのプログラムを利用してみます。
※スレッド化した最新版のプログラムでは邪魔くさくてそんなことしてないのです。

Donut:RAPT#47(IE:6.0.2800.1106;SP1;Q330994;Q813489;Q818529;)

GET / HTTP/1.1
Accept: */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: localhost
Connection: Keep-Alive

Internet Explorer:6.0.2800.1106;SP1;Q330994;Q813489;Q818529;

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: localhost
Connection: Keep-Alive

今手元にあるブラウザは、DonutとIEだけなので2つだけでテストです。 20030731server058を起動し待ち受けた状態で、ブラウザに

http://localhost/
と入力した結果です。この1行目がリクエストラインと呼ばれるもので、ヘッダ部が後ろに続きます。 そして、この例では無いのですがボディ部が続く場合があります。

さて、リクエストラインですが、今の場合

GET / HTTP/1.1
になっています。この行はさらに3つの部分に分けることができます。

1番目は、「GET」です。つまりファイルをくれと言っています。
2番目は、「/」です。 さっきのテストでは、URLに「http://localhost/」と指定しファイル名(たとえばindex.html)がを記述しなかったので「/」だけになっています。 通常WEBサーバは、これに「index.html」を自動で追加します(と聞いたことがあります)。 つまり、この2番目がほしいファイル名になります。
3番目は、何でしょうね。対応しているHTMLのバージョンでしょうね。

で、ヘッダ部は多分どうでもよいというかどうしようもないので保留しますが、気になるのはボディ部(この例には存在しない)です。 POSTメソッドを記述したページからの要求ではボディ部がつくようです。テストしてみましょう。

Donut:RAPT#47(IE:6.0.2800.1106;SP1;Q330994;Q813489;Q818529;)

DISPLAY

Name:
Address:

HTML

<html><body>
<form method="POST" action="http://localhost/">
<div>Name:<input type="text" name="NAME" value="Beatles"></div>
<div>Address:<input type="text" name="ADDR" value="England"></div>
<input type="submit" value="行き">
<input type="reset" value="消し">
</form>
</body></html>

REQUEST

POST / HTTP/1.1
Accept: */*
Accept-Language: ja
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: localhost
Content-Length: 23
Connection: Keep-Alive
Cache-Control: no-cache

NAME=Beatles&ADDR=England

確かに。

to be continued..TOP

今回は無駄に引用しすぎてページが長く伸びてしまったのでココまでにします。

EOFTOP