Comparison

plugins/mod_http_files.lua @ 4671:7e4c1fb44dd7

mod_httpserver: Rename to mod_http_files
author Kim Alvefur <zash@zash.se>
date Mon, 23 Apr 2012 23:37:43 +0200
parent 4670:plugins/mod_httpserver.lua@bd5e5e23942a
child 4672:e17fe44146b0
comparison
equal deleted inserted replaced
4670:bd5e5e23942a 4671:7e4c1fb44dd7
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 --
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9 module:depends("http");
10 local lfs = require "lfs";
11
12 local open = io.open;
13 local stat = lfs.attributes;
14
15 local http_base = module:get_option_string("http_path", "www_files");
16
17 local response_400 = "<h1>Bad Request</h1>Sorry, we didn't understand your request :(";
18 local response_403 = "<h1>Forbidden</h1>You don't have permission to view the contents of this directory :(";
19 local response_404 = "<h1>Page Not Found</h1>Sorry, we couldn't find what you were looking for :(";
20
21 -- TODO: Should we read this from /etc/mime.types if it exists? (startup time...?)
22 local mime_map = {
23 html = "text/html";
24 htm = "text/html";
25 xml = "text/xml";
26 xsl = "text/xml";
27 txt = "text/plain; charset=utf-8";
28 js = "text/javascript";
29 css = "text/css";
30 };
31
32 local function preprocess_path(path)
33 if path:sub(1,1) ~= "/" then
34 path = "/"..path;
35 end
36 local level = 0;
37 for component in path:gmatch("([^/]+)/") do
38 if component == ".." then
39 level = level - 1;
40 elseif component ~= "." then
41 level = level + 1;
42 end
43 if level < 0 then
44 return nil;
45 end
46 end
47 return path;
48 end
49
50 function serve_file(request, path)
51 local response = request.response;
52 path = path and preprocess_path(path);
53 if not path then
54 response.status = 400;
55 return response:send(response_400);
56 end
57 local full_path = http_base..path;
58 if stat(full_path, "mode") == "directory" then
59 if stat(full_path.."/index.html", "mode") == "file" then
60 return serve_file(request, path.."/index.html");
61 end
62 response.status = 403;
63 return response:send(response_403);
64 end
65 local f, err = open(full_path, "rb");
66 if not f then
67 response.status = 404;
68 return response:send(response_404.."<br/>"..tostring(err));
69 end
70 local data = f:read("*a");
71 f:close();
72 if not data then
73 response.status = 403;
74 return response:send(response_403);
75 end
76 local ext = path:match("%.([^.]*)$");
77 response.headers.content_type = mime_map[ext]; -- Content-Type should be nil when not known
78 return response:send(data);
79 end
80
81 module:provides("http", {
82 route = {
83 ["/*"] = serve_file;
84 };
85 });
86