net/http/files.lua
author Kim Alvefur <zash@zash.se>
Tue, 27 Feb 2024 17:14:16 +0100
branch0.12
changeset 13449 360e05f33835
parent 11662 36942fa001b4
child 13450 dba7073f1452
permissions -rw-r--r--
net.http.files: Validate argument to setup function Fixes error in #1765 by throwing an error earlier
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