読者です 読者をやめる 読者になる 読者になる

mochiweb 基礎編

mochiweb erlang

mochiweb を使って色々いじっているのですが、ドキュメントが無く、基本ソースを読むしかないのでメモがてらにまとめていきます。まとめ方はかなり適当です、ごめんなさい。

対象

  • Git の基本を理解している
  • Erlang の基本を理解している
  • HTTP の基本を理解している

インストール済み

  • Git
  • Erlang R14B01(R14B でも R13B04 でもいいです)

git clone mochiweb

% git clone git://github.com/mochi/mochiweb.git
Cloning into mochiweb...

remote: Counting objects: 1348, done.
remote: Compressing objects: 100% (537/537), done.
remote: Total 1348 (delta 918), reused 1134 (delta 780)
Receiving objects: 100% (1348/1348), 480.24 KiB | 212 KiB/s, done.
Resolving deltas: 100% (918/918), done.
% cd mochiweb 
% make
==> mochiweb (get-deps)
==> mochiweb (compile)
Compiled src/mochiweb_sup.erl
Compiled src/reloader.erl
Compiled src/mochiweb_socket.erl
Compiled src/mochiweb_util.erl
Compiled src/mochiweb_skel.erl
Compiled src/mochiweb_request_tests.erl
Compiled src/mochiweb_socket_server.erl
Compiled src/mochiweb_response.erl
Compiled src/mochiweb_mime.erl
Compiled src/mochiweb_io.erl
Compiled src/mochiweb_http.erl
Compiled src/mochiweb_multipart.erl
Compiled src/mochiweb_headers.erl
Compiled src/mochiweb_request.erl
Compiled src/mochiweb_echo.erl
Compiled src/mochiweb_cover.erl
Compiled src/mochiweb_cookies.erl
Compiled src/mochiweb_app.erl
Compiled src/mochiweb_charref.erl
Compiled src/mochiweb_acceptor.erl
Compiled src/mochiweb_html.erl
Compiled src/mochiweb.erl
Compiled src/mochinum.erl
Compiled src/mochiutf8.erl
Compiled src/mochilogfile2.erl
Compiled src/mochitemp.erl
Compiled src/mochilists.erl
Compiled src/mochihex.erl
Compiled src/mochiglobal.erl
Compiled src/mochijson.erl
Compiled src/mochifmt_std.erl
Compiled src/mochifmt_records.erl
Compiled src/mochifmt.erl
Compiled src/mochijson2.erl

ここまでは簡単なのですが問題は mochiweb をフレームワークとして使うため、mochiweb をライブラリの一部として判断させる必要があります。これが Erlang ではかなりやっかいです。

ここでは楽をするためずるい手を使います。

以下の環境変数に mochiweb のパスを指定してください
サンプルは /tmp 以下に clone した前提です。

% export ERL_LIBS=/tmp/mochiweb

これでコンパイル時に mochiweb ライブラリが見えるようになります。

実際にライブラリとして見えているかどうか確認してみましょう。

mochiweb_http:start() が起動すれば問題ありません。

% erl
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.3  (abort with ^G)
1> mochiweb_http:start().
{ok,<0.33.0>}

これでライブラリにパスが通っていることを確認しました。

では念のためちゃんとサーバが起動しているか 127.0.0.1:8888 にブラウザでアクセスしてみましょう。

画面がちゃんと表示されましたか?されていれば次へ行きましょう。

まずは Hello, mochiweb!!

ファイル名は何でもイイですがここでは test_server.erl として書いていきます。

-module(test_server).

%% 手抜き
-compile([export_all]).

%% mochiweb を起動して、ディスパッチ関数を定義する
start() ->
  mochiweb_http:start([{loop, fun dispatcher_requests/1}]).

stop() ->
  mochiweb_http:stop().

%% リクエストを判定して何かしらの応答を返す処理を書く
dispatcher_requests(Req) ->
  Req:ok({"text/html", <<"<html><body>hello mochiweb</body></html>">>}).

さて起動します。

% erl
Erlang R14B02 (erts-5.8.3) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.8.3  (abort with ^G)
1> c(test_server).
{ok,test_server}
2> test_server:start().
{ok,<0.38.0>}

127.0.0.1:8888 にアクセスしてみて、hello mochiweb が表示されることを確認してみてください。

まずはここまで。