次の課題 では 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は改行コード
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] ...以下,メッセージ本体が続く...などとなる.その他の記号については,資料を参照すること.