# HG changeset patch # User jbe # Date 1426865917 -3600 # Node ID aedd13009ddcb2acb2e6e08fc8309fdb231819ad # Parent 4858cffe1aa14ff4a82913de58d912e8f2c13ba4 Proper handling of 404's and mime types for static file delivery diff -r 4858cffe1aa1 -r aedd13009ddc framework/env/request/__init.lua --- a/framework/env/request/__init.lua Fri Mar 20 15:47:51 2015 +0100 +++ b/framework/env/request/__init.lua Fri Mar 20 16:38:37 2015 +0100 @@ -2,6 +2,18 @@ request._in_progress = false -- initialize once +request._mime_types = { + "html", "text/html", + "css", "text/css", + "js", "application/javascript", + "png", "image/png", + "jpeg", "image/jpeg", + "jpg", "image/jpeg", + "gif", "image/gif", + "svg", "image/svg+xml", + "pdf", "application/pdf", + "txt", "text/plain" +} request._absolute_baseurl = nil request._http_options = {} diff -r 4858cffe1aa1 -r aedd13009ddc framework/env/request/handler.lua --- a/framework/env/request/handler.lua Fri Mar 20 15:47:51 2015 +0100 +++ b/framework/env/request/handler.lua Fri Mar 20 16:38:37 2015 +0100 @@ -1,6 +1,6 @@ --[[-- request.handler( - request, -- HTTP request object + http_request, -- HTTP request object close -- boolean indicating whether the server should announce to close the connection ) @@ -18,7 +18,6 @@ end end --- TODO: function incomplete yet function request.handler(http_request, close) _G.app = {} -- may be overwritten or modified by request initializers do @@ -49,11 +48,21 @@ function() if request._route.static then - local f = assert(io.open(WEBMCP_BASE_PATH .. "static/" .. request._route.static, "r")) - local d = f:read("*a") + local f, errmsg = io.open(WEBMCP_BASE_PATH .. "static/" .. request._route.static, "r") + if not f then + if request.get_404_route() then + request.set_status("404 Not Found") + request.forward(request.get_404_route()) + return + else + error('Could not open static file "' .. request._route.static .. '": ' .. errmsg) + end + end + local d = assert(f:read("*a")) f:close() slot.put_into("data", d) - slot.set_layout(nil, "application/octet-stream") -- TODO + local filename_extension = string.match(request._route.static, "%.([^.]+)$") + slot.set_layout(nil, request._mime_types[filename_extension] or "application/octet-stream") return end diff -r 4858cffe1aa1 -r aedd13009ddc framework/env/request/register_mime_type.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/framework/env/request/register_mime_type.lua Fri Mar 20 16:38:37 2015 +0100 @@ -0,0 +1,13 @@ +--[[-- +request.register_mime_type( + filename_extension, + mime_type +) + +Registers a mime type for a given filename extension (case sensitive). + +--]]-- + +function request.register_mime_type(filename_extension, mime_type) + request._mime_types[filename_extension] = mime_type +end