Lua勉強日記(12) CGI
2008/07/01
2011/03/23
やっぱり、apacheで簡単に動かない物を作っても楽しくないので、cgilua*1で提供されているSAPIの上でCGIを作るのを諦めました。(cgiluaは、mod_luaやfcgiとの差違を吸収するSAPIという抽象化層を介して操作するために、単なるCGIを動かすのに余分な手間がかかるので)
そこで、cgiluaと決別して、単純なCGIライブラリを作ることにしました。下のように、拡張子cgiのファイルから使えるものです。
greeting.cgi
#!C:/Kepler/1.1/bin/lua5.1.exe package.path = [[C:/Program Files/Apache Group/Apache2/htdocs/users/lua/?.lua;]] .. package.pathrequire "cgi"local request = cgi.Request.new()local response = cgi.Response.new()local greeting = request.params['greeting'] response.put(string.format([[<html><body>hello, %s!]], greeting) |
cgiluaの中には、ポータブルな捨てがたいライブラリが入っているので、それらは使っていきたいです。
- cgilua/lp.lua
- JSPやPHPのようなテンプレートエンジン。素晴しいことに1つのファイルで実装されていて、他への依存が無い
- cgilua/urlcode.lua
- エスケープ処理などのユーティリティ
作成中のcgiライブラリは、以下のような感じになってます。
cgi.lua
主な内容は、RequestクラスとResponseクラスだけです。
------------------------------------------------------------------------------ CGI library.----------------------------------------------------------------------------local stdout = io.stdoutlocal getenv = os.getenvlocal setmetatable = setmetatablelocal require = requirelocal string = stringlocal table = table module("cgi")local lp = require "cgilua.lp"local get_path_infos = function(path_info)local ret = {}if not path_info or string.len(path_info) < 2 thenreturn ret endstring.gsub(path_info ,"/?([^\/]+)/?",function (x)table.insert(ret, x)end)return retend Request = {}function Request.new()local self = { path_info = getenv('PATH_INFO'), path_infos = get_path_infos(getenv('PATH_INFO')), script_filename = getenv('SCRIPT_FILENAME'), script_name = getenv('SCRIPT_NAME'), app_name = string.gsub(getenv('SCRIPT_NAME'), "[^\/]+$", ""),}return setmetatable(self, {__index = Request})end Response = {}function Response.new()local self = { script_filename = getenv('SCRIPT_FILENAME')}return setmetatable(self, {__index = Response})endfunction Response:put(...) stdout:write(...)endfunction Response:forward(filename, env) self:put("Content-Type: text/html;charset=UTF-8;\n\n") lp.include(self.script_filename .. '/../' .. filename, env)endfunction Response:redirect(to, env) self:put("location: " .. to .. "\n\n")end-- vim: set ft=lua ts=4 sw=4 sts=4 expandtab : |
まだまだ作成途中ですが、他のスクリプト言語と同じように非常に簡単にCGIスクリプトを書くのに取り掛かれるようにはなりそうです。
*1:というかkepler
全国 送料無料でお 届け☆