-- Moonbridge example application -- invoke with ./moonbridge example_application.lua local http = require "moonbridge_http" local documents = {"example_webpage.html", "example_webpage.css"} listen{ -- listen to a tcp version 4 socket { proto = "tcp4", port = 8080, localhost = true }, -- listen to a tcp version 6 socket { proto = "tcp6", port = 8080, localhost = true }, -- listen to a unix domain socket --{ proto = "local", path = 'socket' }, -- execute the listener regularly (without incoming connection) --{ proto = "interval", name = "myint", delay = 10, strict = false }, -- desired number of spare (idle) processes pre_fork = 1, -- number of forks -- minimum number of processes min_fork = 2, -- number of forks -- maximum number of processes (hard limit) max_fork = 16, -- number of forks -- delay between creation of spare processes fork_delay = 1, -- seconds -- delay before retry of failed process creation fork_error_delay = 2, -- seconds -- delay between destruction of excessive spare processes exit_delay = 60, -- seconds -- idle time after a fork gets terminated idle_timeout = 0, -- seconds (0 for no timeout) -- maximum memory consumption before process gets terminated memory_limit = 1024*1024, -- bytes -- preparation of process (executed before fork) prepare = function() for i, document in ipairs(documents) do local file = assert(io.open(document)) documents[document] = file:read("*a") file:close() end end, -- connection handler connect = http.generate_handler( { static_headers = {"Server: Moonbridge Example Server"}, request_body_size_limit = 16*1024*1024*1024 -- allow big file uploads }, function(request) if request.method == "GET" or request.method == "HEAD" then if request.path == "" then request:send_status("303 See Other") request:send_header("Location", "http://" .. request.headers_value.host .. "/example_webpage.html") else local document_name = request.path local document_extension = string.match(document_name, "%.([^.])$") local document = documents[document_name] if document then request:send_status("200 OK") if document_extension == "html" then request:send_header("Content-Type", "text/html; charset=UTF-8") elseif document_extension == "css" then request:send_header("Content-Type", "text/css; charset=UTF-8") end request:send_data(document) else request:send_status("404 Not Found") request:send_header("Content-Type", "text/html; chatset=UTF-8") request:send_data("404 Not Found

404 Not Found

") end end elseif request.method == "POST" then if request.path == "post_example" then local files = {} do local file request:stream_post_param("files", function(chunk, field_name, meta) if meta then file = { file_name = meta.file_name, content_type = meta.content_type, length = 0 } end if chunk then file.length = file.length + #chunk else files[#files+1] = file end end) end request:send_status("200 OK") request:send_header("Content-Type", "text/html; chatset=UTF-8") request:send_data("\n\n") request:send_data('\n') request:send_data("Moonbridge Network Server for Lua Applications – Example Application\n") request:send_data("\n\n") request:send_data("

Moonbridge Network Server for Lua – Example Application

\n") request:send_data("

POST request successful

\n") request:send_data('\n\n\n') for i, file in ipairs(files) do request:send_data("") request:send_data("") request:send_data("") request:send_data('") request:send_data("\n") end request:send_data("\n
File nameContent typeBytes received
", http.encode_html(file.file_name or "(unknown)"), "", http.encode_html(file.content_type or "(unknown)"), "', http.encode_html(tostring(file.length)), "
\n") request:send_data("

Submitted comment: ", http.encode_html(request.post_params.comment), "

\n") request:send_data("\n\n") else request:send_status("404 Not Found") request:send_data("404 Not Found

404 Not Found

") end else request:send_status("405 Method not allowed") end -- returning false causes termination of current process (and re-forking) return true end), -- executed on process termination finish = function() end }