HTTPクライアントとサーバの作成

次の課題 では HTTP1.1 にもとづくクライアントとサーバを作成する. HTTP1.1 の詳しいプロトコル仕様については参考書「HTTP詳説」を参照のこと. 完全な仕様は RFC2616[*]に記述されている.ここでは全てのプロトコルを記述していないので, これらの資料を参考にすること.

本実験で実装するのはHTTP 1.1 のサブセットであり,クライアントがサー バにTCPコネクションを確立し,クライアントからリクエスト(下記文法 のRequest)を送り,それに対してサーバがレスポンス(下記文法のResponse)を返すものとする.本実験で対象とするHTTP 1.1の文法を以下のBNFで定義する.

   HTTP-message   = Request | Response

   ;; クライアントからのリクエスト
   Request        = Request-Line
                    request-header CRLF

   Request-Line   = "GET" SP abs_path SP "HTTP/1.1" CRLF

   request-header = "Host" ":" host [ ":" port ]

   ;; サーバからのレスポンス
   Response       = Status-Line
                    *entity-header CRLF
                    [ message-body ]

   Status-Line    = "HTTP/1.1" SP Status-Code SP Reason-Phrase CRLF
   Status-Code    =   "200"   ; OK
                    | "404"   ; Not Found
   Reason-Phrase  = <CR, LF以外の文字列>

   entity-header  = "Content-Type" ":" media-type
   media-type     = type "/" subtype *( ";" parameter )
   type           = "text"
   subtype        = "plain" | "html"
   parameter      = "charset=us-ascii" | "charset=iso-2022-jp"
ここで,SPは空白文字,abs_pathはファイルの絶対パス,CRLFは改行コード[*]Reason-Phraseはレスポンス のステータスを説明する文字列(下記の例を参考にして適当に設定してよい). 例えば,クライアントがサーバに送信するRequestは,
   GET /index.html HTTP/1.1[CRLF]
   Host: www.hogehoge.com:80[CRLF]
のようになる.また,サーバがクライアントに返すResponseは,
   HTTP/1.1 200 OK[CRLF]
   Content-Type: text/plain; charset=us-ascii[CRLF]
   ...以下,メッセージ本体が続く...
などとなる.その他の記号については,資料を参照すること.



Subsections
NAKAZAWA Koji
2014-09-30