net/http/files.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 13449 360e05f33835
child 13450 dba7073f1452
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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";
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
    11
local new_cache = require "util.cache".new;
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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
7061
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: 6876
diff changeset
    21
local forbidden_chars_pattern = "[/%z]";
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
    22
if package.config:sub(1,1) == "\\" then
7061
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: 6876
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: 6876
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: 6876
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: 6876
diff changeset
    26
local urldecode = require "util.http".urldecode;
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
    27
local function sanitize_path(path) --> util.paths or util.http?
7231
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7061
diff changeset
    28
	if not path then return end
7061
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
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: 6876
diff changeset
    46
	end
7233
20246b139607 mod_http_files: Preserve a trailing / in paths (fixes #639)
Kim Alvefur <zash@zash.se>
parents: 7232
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: 7232
diff changeset
    48
		out[c+1] = "";
20246b139607 mod_http_files: Preserve a trailing / in paths (fixes #639)
Kim Alvefur <zash@zash.se>
parents: 7232
diff changeset
    49
	end
7061
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: 6876
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: 6876
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: 6876
diff changeset
    52
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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: 9952
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: 9952
diff changeset
    59
	local cache_max_file_size = tonumber(opts.cache_max_file_size) or 1024
9465
6489d75ff1d6 mod_http_files: Silence luacheck warnings related to config variables
Kim Alvefur <zash@zash.se>
parents: 8760
diff changeset
    60
	-- luacheck: ignore 431
13449
360e05f33835 net.http.files: Validate argument to setup function
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
    61
	local base_path = assert(opts.path, "invalid argument to net.http.files.path(), missing required 'path'");
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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;
7231
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7061
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: 7061
diff changeset
    67
		if path and not sanitized_path then
7061
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: 6876
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: 6876
diff changeset
    69
		end
7231
b5b7ae2901e6 mod_http_files: Fix traceback when serving a non-wildcard path (fixes #611)
Kim Alvefur <zash@zash.se>
parents: 7061
diff changeset
    70
		path = sanitized_path;
7061
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: 6876
diff changeset
    71
		local orig_path = sanitize_path(request.path);
7232
dcc8ed11173c mod_http_files: Don't prepend / to path twice, sanitize path does this already
Kim Alvefur <zash@zash.se>
parents: 7231
diff changeset
    72
		local full_path = base_path .. (path or ""):gsub("/", path_sep);
6875
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
10780
8f3b87eaec49 mod_http_files: Avoid using inode in etag, fix #1498
Kim Alvefur <zash@zash.se>
parents: 9466
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
7493
b75b08af7a78 mod_http_files: Switch to use util.cache for cache
Kim Alvefur <zash@zash.se>
parents: 7490
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;
10069
b399dca1273c net.http.files: Fix cache handling
Kim Alvefur <zash@zash.se>
parents: 10065
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
9466
f7530c846f98 mod_http_files: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 9465
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: 9465
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: 9465
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
8760
861a7d6c12d8 mod_http_files: Correct cache insertion (fixes #1130)
Kim Alvefur <zash@zash.se>
parents: 7994
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");
7494
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7493
diff changeset
   122
			if not f then
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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];
7494
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7493
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: 7493
diff changeset
   129
			if attr.size > cache_max_file_size then
10331
34f7a0e8fa59 net.http.files: Explicitly convert number to string, avoiding implicit coercion
Kim Alvefur <zash@zash.se>
parents: 10069
diff changeset
   130
				response_headers.content_length = ("%d"):format(attr.size);
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
   131
				log("debug", "%d > cache_max_file_size", attr.size);
7494
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7493
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: 7493
diff changeset
   133
			else
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7493
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: 7493
diff changeset
   135
				f:close();
491975f5d383 mod_http_files: Send larger files using new file handle API
Kim Alvefur <zash@zash.se>
parents: 7493
diff changeset
   136
			end
7493
b75b08af7a78 mod_http_files: Switch to use util.cache for cache
Kim Alvefur <zash@zash.se>
parents: 7490
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
9953
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
   146
return {
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
diff changeset
   147
	serve = serve;
a39f3681d685 net.http.files: Make into standalone library
Kim Alvefur <zash@zash.se>
parents: 9952
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