2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
9 module:depends("http");
10 local lfs = require "lfs";
13 local stat = lfs.attributes;
15 local http_base = module:get_option_string("http_files_dir", module:get_option_string("http_path", "www_files"));
17 -- TODO: Should we read this from /etc/mime.types if it exists? (startup time...?)
23 txt = "text/plain; charset=utf-8";
24 js = "text/javascript";
28 local function preprocess_path(path)
29 if path:sub(1,1) ~= "/" then
33 for component in path:gmatch("([^/]+)/") do
34 if component == ".." then
36 elseif component ~= "." then
46 function serve_file(event, path)
47 local response = event.response;
48 path = path and preprocess_path(path);
52 local full_path = http_base..path;
53 if stat(full_path, "mode") == "directory" then
54 if stat(full_path.."/index.html", "mode") == "file" then
55 return serve_file(event, path.."/index.html");
59 local f, err = open(full_path, "rb");
61 module:log("warn", "Failed to open file: %s", err);
64 local data = f:read("*a");
69 local ext = path:match("%.([^.]*)$");
70 response.headers.content_type = mime_map[ext]; -- Content-Type should be nil when not known
71 return response:send(data);
74 module:provides("http", {