Erlang/OTP + Lua で HTTP テスト #1

Erlang/OTP + Lua で色々作ってきた。本番に突っ込んだりした。うまくいったのはゲームのボス

Lua はシンプルな言語でとてもよい。といっても table に対しては不満はいくつかあるが、ここでは省略しておくことにする。

普段は Nginx + Lua (OpenResty) を使って書いたりもしている。これもかなりの行数を大規模に突っ込んだ。

Nginx + Lua を見たときから、組込 Lua はとても良いと感じていた。

もともとテストツールをもっとうまいこと作れないだろうかとずっと考えていた。ただ、 Lua でテストツールを作ると状態をもったりネットワーク周りを頑張ったりするのはやりたくない。

ベース部分を全て Erlang/OTP でかいて、シナリオだけを Lua で書くというのが理想だ。ただその場合は Erlang の機能を Lua 側から呼び出せる必要がある。これは luerl を使えば実現可能だ。

luerl で早速 Cowboy の作者が作っている Gun という HTTP 非同期クライアントをラップしてみて、Lua から呼び出すようにしてみた。

local response = http.request(“GET”, “http://example.com”)
assert(response.status_code == 200)

response はテーブルで response.status_code と書けば 200 が取れる。もちろん response.body とやれば body が取れる。

このコードは実際は gun:open/2 から続き gun:request/4 を呼んでいる。Lua のコードを luerl で解釈して、 Erlang 定義した http クライアントを呼んで、その結果を luerl で戻している。

今後はこれを並列で 100 並べて処理して、結果を取れるようにしていきたい。もちろん HTTPS に対応したりしていきたい。

これをうまく使って行けば WebSocket のテストなども Lua で気軽に書けるようになる。最終的には Electron でテストシナリオ専用の Lua エディタを作り、そこから気軽にテストを実行できるようにしていきたい。

HTTP/2 や QUIC の対応も全て Lua からかけたらとてもステキでは無いだろうか。

まずは、ここまで。続く。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store