04.httpサーバー2 - ohr486/ElixirHandsOn20230719 GitHub Wiki

利用ライブラリ解説

Map.put

※ 要素なしの空mapは%{}で表現できる

パイプ演算子(|>)

サンプル実装(ネタバレ注意)

lib/web_server/header.ex

httpサーバー(ver2)

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

⚠️ **GitHub.com Fallback** ⚠️