Software /
code /
prosody
Comparison
plugins/mod_http_files.lua @ 4716:6eeb142a8073
mod_http_files, net.http.parser: Move path normalization to net.http.parser so that all modules can benefit
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 26 Apr 2012 16:48:16 +0100 |
parent | 4703:684ea42ca77a |
child | 4722:1138fd3d5846 |
comparison
equal
deleted
inserted
replaced
4715:4d6ebe54671e | 4716:6eeb142a8073 |
---|---|
23 txt = "text/plain; charset=utf-8"; | 23 txt = "text/plain; charset=utf-8"; |
24 js = "text/javascript"; | 24 js = "text/javascript"; |
25 css = "text/css"; | 25 css = "text/css"; |
26 }; | 26 }; |
27 | 27 |
28 local function preprocess_path(path) | |
29 if path:sub(1,1) ~= "/" then | |
30 path = "/"..path; | |
31 end | |
32 local level = 0; | |
33 for component in path:gmatch("([^/]+)/") do | |
34 if component == ".." then | |
35 level = level - 1; | |
36 elseif component ~= "." then | |
37 level = level + 1; | |
38 end | |
39 if level < 0 then | |
40 return nil; | |
41 end | |
42 end | |
43 return path; | |
44 end | |
45 | |
46 function serve_file(event, path) | 28 function serve_file(event, path) |
47 local response = event.response; | 29 local response = event.response; |
48 path = path and preprocess_path(path); | 30 local full_path = http_base.."/"..path; |
49 if not path then | |
50 return 400; | |
51 end | |
52 local full_path = http_base..path; | |
53 if stat(full_path, "mode") == "directory" then | 31 if stat(full_path, "mode") == "directory" then |
54 if stat(full_path.."/index.html", "mode") == "file" then | 32 if stat(full_path.."/index.html", "mode") == "file" then |
55 return serve_file(event, path.."/index.html"); | 33 return serve_file(event, path.."/index.html"); |
56 end | 34 end |
57 return 403; | 35 return 403; |