04.httpサーバー2 - ohr486/ElixirHandsOn20230719 GitHub Wiki
※ 要素なしの空mapは%{}で表現できる
HTTPサーバーのこのバージョンでは、HTTPリクエストメッセージのリクエストラインやヘッダ情報を解析して、HTTPレスポンスメッセージを返却します。
リクエスト時の情報をMap型のデータで保持し、
レスポンスメッセージのbodyに設定して返却するようにしましょう。
HTTPリクエストメッセージのリクエストラインの情報(メソッド、ターゲット、プロトコルバージョン)、全てのヘッダのフィールドと値を、 レスポンスbodyとして返却するように改造してください。 このサーバーをHeaderという名前のモジュールで、関数名はstartとすることにします。
(1)
基本的なプログラムの構造は[03.httpサーバー]と同じです。
返却する文字列の代わりに、リクエスト情報が入っているMapデータを利用してください。
ただし、Mapデータは文字列ではないので、#{map}が利用できません。
inspectを使って、#{inspect map}とする必要があります。
(2)
前のバージョンのリクエストメッセージの受信処理(1行分)を行う関数の引数(handle_server)は、acceptソケットのみでした。
新しいバージョンの受信処理を行う関数の引数に、コネクション情報(Map型の変数conn)を追加しましょう。
(リクエストメッセージ1行1行の読み込み毎に)コネクション情報を更新しながらHTTPリクエストメッセージを解析させてください。
(3)
Mapの使い方
データの挿入: Map.put(map, key, val)
データの取得: Map.get(map, key, val)
Mapデータの表示: inspect(map) ※ inspectを使うとmapデータの中身を表示できます
(4)
パイプ演算子
Map.put(%{}, :k1, 1) #=> %{:k1, 1}
Map.put(%{:k1, 1}, :k2, 2) #=> %{:k1: 1, :v2: 2}
は
%{} |> Map.put(:k1, 1) |> Map.put(:k2, 2)
と記述できます
$ mix run -e 'WebServer.Header.start'
ブラウザでhttp://localhost:8000を開くと、リクエスト情報が表示されます。
また、curlを使って、リクエストメソッドやURL、ヘッダを変えてアクセスしてみてください。 リクエスト情報の内容がどう変わるかをみてみましょう。
※ curlの使い方
curl -X <メソッド> http://localhost:8000/your/path
ex) GETメソッドで、/ping にアクセスする場合
curl http://localhost:8000/ping
ex) POSTメソッドで、/foo にアクセスする場合
curl -X POST http://localhost:8000/foo
ex) PUTメソッドで、/var に、ヘッダ情報 MY_HEADER: my-header でアクセスする場合
curl -X PUT -H 'MY_HEADER: my-header' http://localhost:8000/var