Software /
code /
prosody
Comparison
plugins/mod_http_files.lua @ 5253:ad45612199e0
mod_http_files: Avoid a bunch of table lookups
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 21 Dec 2012 08:14:33 +0100 |
parent | 5252:6209b9a0244b |
child | 5254:df3552822054 |
comparison
equal
deleted
inserted
replaced
5252:6209b9a0244b | 5253:ad45612199e0 |
---|---|
55 local attr = stat(full_path); | 55 local attr = stat(full_path); |
56 if not attr then | 56 if not attr then |
57 return 404; | 57 return 404; |
58 end | 58 end |
59 | 59 |
60 local request_headers, response_headers = request.headers, response.headers; | |
61 | |
60 local last_modified = os_date('!%a, %d %b %Y %H:%M:%S GMT', attr.modification); | 62 local last_modified = os_date('!%a, %d %b %Y %H:%M:%S GMT', attr.modification); |
61 response.headers.last_modified = last_modified; | 63 response_headers.last_modified = last_modified; |
62 | 64 |
63 local etag = ("%02x-%x-%x-%x"):format(attr.dev or 0, attr.ino or 0, attr.size or 0, attr.modification or 0); | 65 local etag = ("%02x-%x-%x-%x"):format(attr.dev or 0, attr.ino or 0, attr.size or 0, attr.modification or 0); |
64 response.headers.etag = etag; | 66 response_headers.etag = etag; |
65 | 67 |
66 if etag == request.headers.if_none_match | 68 local if_none_match = request_headers.if_none_match |
67 or last_modified == request.headers.if_modified_since then | 69 local if_modified_since = request_headers.if_modified_since; |
70 if etag == if_none_match | |
71 or last_modified == if_modified_since then | |
68 return 304; | 72 return 304; |
69 end | 73 end |
70 | 74 |
71 local data = cache[path]; | 75 local data = cache[path]; |
72 if data then | 76 if data then |
73 response.headers.content_type = data.content_type; | 77 response_headers.content_type = data.content_type; |
74 data = data.data; | 78 data = data.data; |
75 elseif attr.mode == "directory" then | 79 elseif attr.mode == "directory" then |
76 if full_path:sub(-1) ~= "/" then | 80 if full_path:sub(-1) ~= "/" then |
77 response.headers.location = orig_path.."/"; | 81 response_headers.location = orig_path.."/"; |
78 return 301; | 82 return 301; |
79 end | 83 end |
80 for i=1,#dir_indices do | 84 for i=1,#dir_indices do |
81 if stat(full_path..dir_indices[i], "mode") == "file" then | 85 if stat(full_path..dir_indices[i], "mode") == "file" then |
82 return serve_file(event, path..dir_indices[i]); | 86 return serve_file(event, path..dir_indices[i]); |
100 :up():up(); | 104 :up():up(); |
101 end | 105 end |
102 end | 106 end |
103 data = "<!DOCTYPE html>\n"..tostring(html); | 107 data = "<!DOCTYPE html>\n"..tostring(html); |
104 cache[path] = { data = data, content_type = mime_map.html; hits = 0 }; | 108 cache[path] = { data = data, content_type = mime_map.html; hits = 0 }; |
105 response.headers.content_type = mime_map.html; | 109 response_headers.content_type = mime_map.html; |
106 end | 110 end |
107 | 111 |
108 else | 112 else |
109 local f, err = open(full_path, "rb"); | 113 local f, err = open(full_path, "rb"); |
110 if f then | 114 if f then |
115 return 403; | 119 return 403; |
116 end | 120 end |
117 local ext = path:match("%.([^.]*)$"); | 121 local ext = path:match("%.([^.]*)$"); |
118 local content_type = mime_map[ext]; | 122 local content_type = mime_map[ext]; |
119 cache[path] = { data = data; content_type = content_type; }; | 123 cache[path] = { data = data; content_type = content_type; }; |
120 response.headers.content_type = content_type; | 124 response_headers.content_type = content_type; |
121 end | 125 end |
122 | 126 |
123 return response:send(data); | 127 return response:send(data); |
124 end | 128 end |
125 | 129 |