しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Lua で処理が書ける IIS 向け HTTP モジュール lua-iis-module を作ったので公開しました

Apache と nginx では Lua を使って HTTP リクエストに対して処理を書けるのが羨ましかったので、IIS でも lua-nginx-module のような処理が書ける HTTP モジュールを実装しました。要するにパクリです。

バイナリの配布はしていないので、ソースコードからのビルドが必要です。

少し前にネイティブ HTTP モジュールの作り方を調べていた時に、プロトタイプ的なものを作ったら思ったよりいい感じだったので頑張りました。

インストール方法は IIS Manager や appcmd から叩くだけなので省略します。

簡単な使い方

頑張って Web.config から実行する Lua スクリプトを設定可能にしたので、使う場合には以下のように Web.config に iislua 要素を追加する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <iislua beginRequest="C:\inetpub\script.lua" />
  </system.webServer>
</configuration>

今は beginRequest しか用意してません。IIS から読み取れるパスにスクリプトを置いておきます。

これだけだと不明な要素として実行時エラーになるので、applicationHost.config を修正して iislua 要素を Web.config から使えるように設定しておきます。

<configuration>
  <configSections>
    <sectionGroup name="system.webServer">
      <!-- この 1 行だけを追加する -->
      <section name="iislua" overrideModeDefault="Allow" />
    </sectionGroup>
  </configSections>
</configuration>

これで lua-iis-module が動くようになります。実際に分かりやすい例を紹介してみます。

ステータスコードを返す

基本的に IIS で行える処理は iis というライブラリにまとまっています。ステータスコードを返して処理を終わらせるには iis.exit メソッドを使います。

-- 400 Bad Request を返す
iis.exit(400)

これで後続の処理が打ち切られて 400 としてレスポンスが返ります。簡単ですね。

リダイレクトする

リダイレクトを行うには iis.redirect メソッドに移動したい URL を指定して呼び出します。

-- ブチザッキへリダイレクト
iis.redirect("http://buchizo.wordpress.com/")

これでアクセスすると、必ずブチザッキにリダイレクトが行われます。

単純にリダイレクトするだけだと面白くないので、少し処理を追加してみます。基本的に Lua そのままなので条件分岐なども簡単に書けます。

-- 50% の確率でブチザッキか SE の雑記にリダイレクト
if math.random() > 0.5 then
    iis.redirect("http://buchizo.wordpress.com/")
else
    iis.redirect("http://blog.engineer-memo.com/")
end

普段なら ASP.NET のお世話になるところですが、lua-iis-module を使うと簡単に書けます。

HTML コンテンツを返す

実際に HTML を返したい機会があるかは謎ですが、iis.print メソッドと iis.resp.set_header メソッドを組み合わせることで HTML も返せます。

-- HTML を返す
iis.resp.set_header("Content-Type", "text/html")
iis.print("<html><body><h1>Hello, World</h1></body></html>")

iis.print はレスポンスボディに文字列を書き出すシンプルなメソッドです。

Access-Control-Allow-Origin を返す

これまでと比べて複雑な処理として、クロスドメイン通信を行うために必要な HTTP ヘッダーを lua-iis-module を使って書き出してみます。

-- Origin で指定されたホストをそのまま返す
req_headers = iis.req.get_headers()

if req_headers["Origin"] ~= nil then
    iis.resp.set_header("Access-Control-Allow-Origin", req_headers["Origin"])
end

Origin がリクエストヘッダーに含まれていたら、そのまま Access-Control-Allow-Origin として返す処理なので簡単でした。iis.req.get_headers はテーブル型を返すので、簡単にヘッダーにアクセスできます。

これまで URL Rewrite で頑張っていた部分を lua-iis-module で置き換えることが出来ました。割と使えそうな子なので、もうちょっと頑張って作りこんでみたいと思います。特にリライト周りとか。

追記

現在、実装済みのメソッド一覧を GitHub の Wiki にまとめました。少しずつメソッドを増やしています。

Home · shibayan/iislua Wiki · GitHub

もうちょっとまともな説明は、あとで頑張って書きたいと思います…。