+-- Prosody IM
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
+--
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
local socket = require "socket"
local server = require "net.server"
local t_insert, t_concat = table.insert, table.concat;
local s_match, s_gmatch = string.match, string.gmatch;
-local tonumber, tostring, pairs = tonumber, tostring, pairs;
+local tonumber, tostring, pairs, ipairs, type = tonumber, tostring, pairs, ipairs, type;
-local urlcodes = setmetatable({}, { __index = function (t, k) t[k] = char(tonumber("0x"..k)); return t[k]; end });
-local urlencode = function (s) return s and (s:gsub("%W", function (c) return string.format("%%%x", c:byte()); end)); end
+local urlencode = function (s) return s and (s:gsub("%W", function (c) return string.format("%%%02x", c:byte()); end)); end
local log = require "util.logger".init("httpserver");
end
else
-- Response we have is just a string (the body)
- log("debug", "Sending response to %s: %s", request.id, response);
+ log("debug", "Sending response to %s: %s", request.id or "<none>", response or "<none>");
resp = { "HTTP/1.0 200 OK\r\n" };
t_insert(resp, "Connection: close\r\n");
if response then
if response == true and not request.destroyed then
-- Keep connection open, we will reply later
- log("warn", "Request %s left open, on_destroy is %s", request.id, tostring(request.on_destroy));
+ log("debug", "Request %s left open, on_destroy is %s", request.id, tostring(request.on_destroy));
elseif response ~= true then
-- Assume response
send_response(request, response);
end
end
+function new_from_config(ports, default_base, handle_request)
+ for _, options in ipairs(ports) do
+ local port, base, ssl, interface = 5280, default_base, false, nil;
+ if type(options) == "number" then
+ port = options;
+ elseif type(options) == "table" then
+ port, base, ssl, interface = options.port or 5280, options.path or default_base, options.ssl or false, options.interface;
+ elseif type(options) == "string" then
+ base = options;
+ end
+
+ if ssl then
+ ssl.mode = "server";
+ ssl.protocol = "sslv23";
+ end
+
+ new{ port = port, base = base, handler = handle_request, ssl = ssl, type = (ssl and "ssl") or "tcp" }
+ end
+end
+
_M.request_reader = request_reader;
_M.send_response = send_response;
_M.urlencode = urlencode;