Annotate

net/http/files.lua @ 11853:ae5ac9830add

mod_http_file_share: return 401 instead of 403 if authentication failed This is as per the HTTP standards [1]. Thankfully, the REQUIRED www-authenticate header is already generated by the code. [1]: https://datatracker.ietf.org/doc/html/rfc7235#section-3.1
author Jonas Schäfer <jonas@wielicki.name>
date Tue, 19 Oct 2021 16:37:32 +0200
parent 11658:36942fa001b4
child 12974:ba409c67353b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1384
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2785
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2785
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5718
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1384
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1384
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1384
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1384
diff changeset
8
5263
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
9 local server = require"net.http.server";
3353
cd3cbf361f8f mod_httpserver: Serve index.html if a request is made for a directory and it contains one (thanks Brian Cully)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
10 local lfs = require "lfs";
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
11 local new_cache = require "util.cache".new;
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
12 local log = require "util.logger".init("net.http.files");
635
25f1117d7886 Add initial mod_httpserver for serving static content
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
5235
e0373e0dd048 mod_http_files: Add Last-Modified header
Kim Alvefur <zash@zash.se>
parents: 5234
diff changeset
14 local os_date = os.date;
635
25f1117d7886 Add initial mod_httpserver for serving static content
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local open = io.open;
3353
cd3cbf361f8f mod_httpserver: Serve index.html if a request is made for a directory and it contains one (thanks Brian Cully)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
16 local stat = lfs.attributes;
5257
b125892e187c mod_http_files: Escape paths in redirects
Kim Alvefur <zash@zash.se>
parents: 5256
diff changeset
17 local build_path = require"socket.url".build_path;
6030
9b91242cc137 mod_http_files: Strip path separator from end of paths, was broken on Windows (thanks Junne)
Kim Alvefur <zash@zash.se>
parents: 5716
diff changeset
18 local path_sep = package.config:sub(1,1);
635
25f1117d7886 Add initial mod_httpserver for serving static content
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19
2771
c9834f338a4e mod_httpserver: Return Content-Type header based on file extension.
Waqas Hussain <waqas20@gmail.com>
parents: 1870
diff changeset
20
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
21 local forbidden_chars_pattern = "[/%z]";
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
22 if package.config:sub(1,1) == "\\" then
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
23 forbidden_chars_pattern = "[/%z\001-\031\127\"*:<>?|]"
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
24 end
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
25
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
26 local urldecode = require "util.http".urldecode;
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
27 local function sanitize_path(path) --> util.paths or util.http?
7228
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7058
diff changeset
28 if not path then return end
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
29 local out = {};
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
30
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
31 local c = 0;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
32 for component in path:gmatch("([^/]+)") do
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
33 component = urldecode(component);
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
34 if component:find(forbidden_chars_pattern) then
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
35 return nil;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
36 elseif component == ".." then
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
37 if c <= 0 then
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
38 return nil;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
39 end
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
40 out[c] = nil;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
41 c = c - 1;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
42 elseif component ~= "." then
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
43 c = c + 1;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
44 out[c] = component;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
45 end
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
46 end
7230
20246b139607 mod_http_files: Preserve a trailing / in paths (fixes #639)
Kim Alvefur <zash@zash.se>
parents: 7229
diff changeset
47 if path:sub(-1,-1) == "/" then
20246b139607 mod_http_files: Preserve a trailing / in paths (fixes #639)
Kim Alvefur <zash@zash.se>
parents: 7229
diff changeset
48 out[c+1] = "";
20246b139607 mod_http_files: Preserve a trailing / in paths (fixes #639)
Kim Alvefur <zash@zash.se>
parents: 7229
diff changeset
49 end
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
50 return "/"..table.concat(out, "/");
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
51 end
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
52
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
53 local function serve(opts)
5268
69964d1cbe66 mod_http_files: Allow passing a string to serve()
Kim Alvefur <zash@zash.se>
parents: 5265
diff changeset
54 if type(opts) ~= "table" then -- assume path string
69964d1cbe66 mod_http_files: Allow passing a string to serve()
Kim Alvefur <zash@zash.se>
parents: 5265
diff changeset
55 opts = { path = opts };
69964d1cbe66 mod_http_files: Allow passing a string to serve()
Kim Alvefur <zash@zash.se>
parents: 5265
diff changeset
56 end
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
57 local mime_map = opts.mime_map or { html = "text/html" };
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
58 local cache = new_cache(opts.cache_size or 256);
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
59 local cache_max_file_size = tonumber(opts.cache_max_file_size) or 1024
9462
6489d75ff1d6 mod_http_files: Silence luacheck warnings related to config variables
Kim Alvefur <zash@zash.se>
parents: 8757
diff changeset
60 -- luacheck: ignore 431
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
61 local base_path = opts.path;
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
62 local dir_indices = opts.index_files or { "index.html", "index.htm" };
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
63 local directory_index = opts.directory_index;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
64 local function serve_file(event, path)
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
65 local request, response = event.request, event.response;
7228
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7058
diff changeset
66 local sanitized_path = sanitize_path(path);
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7058
diff changeset
67 if path and not sanitized_path then
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
68 return 400;
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
69 end
7228
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7058
diff changeset
70 path = sanitized_path;
7058
e9f07febafb3 mod_http_files: Santize the path relative to our base URL before translating it to a filesystem path, fixes a relative path traversal vulnerability
Matthew Wild <mwild1@gmail.com>
parents: 6873
diff changeset
71 local orig_path = sanitize_path(request.path);
7229
dcc8ed11173c mod_http_files: Don't prepend / to path twice, sanitize path does this already
Kim Alvefur <zash@zash.se>
parents: 7228
diff changeset
72 local full_path = base_path .. (path or ""):gsub("/", path_sep);
6872
eb28067faadf mod_http_files: Strip trailing directory separator regardless of directionality of the slash (fixes #545)
Kim Alvefur <zash@zash.se>
parents: 6030
diff changeset
73 local attr = stat(full_path:match("^.*[^\\/]")); -- Strip trailing path separator because Windows
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
74 if not attr then
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
75 return 404;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
76 end
5248
13553f4132a8 mod_http_files: Compare If-Modified-Since to last modification date
Kim Alvefur <zash@zash.se>
parents: 5247
diff changeset
77
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
78 local request_headers, response_headers = request.headers, response.headers;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
79
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
80 local last_modified = os_date('!%a, %d %b %Y %H:%M:%S GMT', attr.modification);
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
81 response_headers.last_modified = last_modified;
5234
a9f0a1becc66 mod_http_files: Add ETag and check If-None-Match to allow client-side cache
Kim Alvefur <zash@zash.se>
parents: 5233
diff changeset
82
10776
8f3b87eaec49 mod_http_files: Avoid using inode in etag, fix #1498
Kim Alvefur <zash@zash.se>
parents: 9463
diff changeset
83 local etag = ('"%x-%x-%x"'):format(attr.change or 0, attr.size or 0, attr.modification or 0);
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
84 response_headers.etag = etag;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
85
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
86 local if_none_match = request_headers.if_none_match
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
87 local if_modified_since = request_headers.if_modified_since;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
88 if etag == if_none_match
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
89 or (not if_none_match and last_modified == if_modified_since) then
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
90 return 304;
4868
550f0a5e85c5 mod_http_files: Respond with a 301 redirect for directories to append a / (fixes relative links)
Kim Alvefur <zash@zash.se>
parents: 4722
diff changeset
91 end
550f0a5e85c5 mod_http_files: Respond with a 301 redirect for directories to append a / (fixes relative links)
Kim Alvefur <zash@zash.se>
parents: 4722
diff changeset
92
7490
b75b08af7a78 mod_http_files: Switch to use util.cache for cache
Kim Alvefur <zash@zash.se>
parents: 7487
diff changeset
93 local data = cache:get(orig_path);
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
94 if data and data.etag == etag then
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
95 response_headers.content_type = data.content_type;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
96 data = data.data;
10065
b399dca1273c net.http.files: Fix cache handling
Kim Alvefur <zash@zash.se>
parents: 10061
diff changeset
97 cache:set(orig_path, data);
5264
700ff21a0451 mod_http_files: Work with non-wildcard-routes. Key cache on the original HTTP path.
Kim Alvefur <zash@zash.se>
parents: 5263
diff changeset
98 elseif attr.mode == "directory" and path then
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
99 if full_path:sub(-1) ~= "/" then
9463
f7530c846f98 mod_http_files: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 9462
diff changeset
100 local dir_path = { is_absolute = true, is_directory = true };
f7530c846f98 mod_http_files: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 9462
diff changeset
101 for dir in orig_path:gmatch("[^/]+") do dir_path[#dir_path+1]=dir; end
f7530c846f98 mod_http_files: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 9462
diff changeset
102 response_headers.location = build_path(dir_path);
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
103 return 301;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
104 end
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
105 for i=1,#dir_indices do
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
106 if stat(full_path..dir_indices[i], "mode") == "file" then
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
107 return serve_file(event, path..dir_indices[i]);
5238
0cc0359d8c39 mod_http_files: Generate simple directory index.
Kim Alvefur <zash@zash.se>
parents: 5237
diff changeset
108 end
0cc0359d8c39 mod_http_files: Generate simple directory index.
Kim Alvefur <zash@zash.se>
parents: 5237
diff changeset
109 end
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
110
5263
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
111 if directory_index then
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
112 data = server._events.fire_event("directory-index", { path = request.path, full_path = full_path });
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
113 end
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
114 if not data then
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
115 return 403;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
116 end
8757
861a7d6c12d8 mod_http_files: Correct cache insertion (fixes #1130)
Kim Alvefur <zash@zash.se>
parents: 7991
diff changeset
117 cache:set(orig_path, { data = data, content_type = mime_map.html; etag = etag; });
5263
736e7ec8cd2e mod_http_files: Replace file listing with an event, allowing a different plugin to generate it
Kim Alvefur <zash@zash.se>
parents: 5262
diff changeset
118 response_headers.content_type = mime_map.html;
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
119
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
120 else
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
121 local f, err = open(full_path, "rb");
7491
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
122 if not f then
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
123 log("debug", "Could not open %s. Error was %s", full_path, err);
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
124 return 403;
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
125 end
5269
7bc52402966d mod_http_files: Fix sending Content-Type for index files
Kim Alvefur <zash@zash.se>
parents: 5268
diff changeset
126 local ext = full_path:match("%.([^./]+)$");
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
127 local content_type = ext and mime_map[ext];
7491
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
128 response_headers.content_type = content_type;
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
129 if attr.size > cache_max_file_size then
10327
34f7a0e8fa59 net.http.files: Explicitly convert number to string, avoiding implicit coercion
Kim Alvefur <zash@zash.se>
parents: 10065
diff changeset
130 response_headers.content_length = ("%d"):format(attr.size);
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
131 log("debug", "%d > cache_max_file_size", attr.size);
7491
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
132 return response:send_file(f);
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
133 else
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
134 data = f:read("*a");
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
135 f:close();
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7490
diff changeset
136 end
7490
b75b08af7a78 mod_http_files: Switch to use util.cache for cache
Kim Alvefur <zash@zash.se>
parents: 7487
diff changeset
137 cache:set(orig_path, { data = data; content_type = content_type; etag = etag });
5238
0cc0359d8c39 mod_http_files: Generate simple directory index.
Kim Alvefur <zash@zash.se>
parents: 5237
diff changeset
138 end
0cc0359d8c39 mod_http_files: Generate simple directory index.
Kim Alvefur <zash@zash.se>
parents: 5237
diff changeset
139
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
140 return response:send(data);
3353
cd3cbf361f8f mod_httpserver: Serve index.html if a request is made for a directory and it contains one (thanks Brian Cully)
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
141 end
5233
342c46e62f50 mod_http_files: Return 404 faster if file does not exist
Kim Alvefur <zash@zash.se>
parents: 5232
diff changeset
142
5262
4e58fde55594 mod_http_files: Export function can be used by other modules to serve files. Don't serve files by default unless http_files_dir is set
Kim Alvefur <zash@zash.se>
parents: 5261
diff changeset
143 return serve_file;
1667
c7bb2264e3b8 mod_httpserver: Set default file handler (you can now request static files as /*) and restructure code a bit
Matthew Wild <mwild1@gmail.com>
parents: 1552
diff changeset
144 end
1770
3e17002221eb mod_httpserver: Backport from trunk more thorough validation of URLs prior to processing
Matthew Wild <mwild1@gmail.com>
parents: 1552
diff changeset
145
9949
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
146 return {
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
147 serve = serve;
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9948
diff changeset
148 }
1667
c7bb2264e3b8 mod_httpserver: Set default file handler (you can now request static files as /*) and restructure code a bit
Matthew Wild <mwild1@gmail.com>
parents: 1552
diff changeset
149