# HG changeset patch # User jbe # Date 1424824407 -3600 # Node ID 25a20bd1f4161b60abb62e3e9b283cdf61f6fd57 # Parent e69251d4ba0e3b990ab5ad9daa16fb6c71c7533e More work on Moonbridge integration: several changes in env/request diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/__init.lua --- a/framework/env/request/__init.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/__init.lua Wed Feb 25 01:33:27 2015 +0100 @@ -1,12 +1,12 @@ request._http_request = nil request._http_options = {} +request._response_headers = {} request._status = nil request._forward = nil request._forward_processed = false request._redirect = nil request._absolute_baseurl = nil -request._is_404 = false request._404_route = nil request._force_absolute_baseurl = false request._perm_params = {} diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/add_header.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/framework/env/request/add_header.lua Wed Feb 25 01:33:27 2015 +0100 @@ -0,0 +1,3 @@ +function request.add_header(key, value) + request._response_headers[#request._response_headers+1] = {key, value} +end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/default_router.lua --- a/framework/env/request/default_router.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/default_router.lua Wed Feb 25 01:33:27 2015 +0100 @@ -12,25 +12,22 @@ if not path then return nil end - if not string.match(path, "^/") then - path = "/" .. path - end - if path == "/" then + if path == "" then return {module = "index", view = "index"} end - module = string.match(path, "^/([^/]+)/$") + module = string.match(path, "^([^/]+)/$") if module then return {module = module, view = "index"} end - module, action = string.match(path, "^/([^/]+)/([^/.]+)$") + module, action = string.match(path, "^([^/]+)/([^/.]+)$") if module then return {module = module, action = action} end - module, view, suffix = string.match(path, "^/([^/]+)/([^/.]+)%.([^/]+)$") + module, view, suffix = string.match(path, "^([^/]+)/([^/.]+)%.([^/]+)$") if module then return {module = module, view = view, suffix = suffix} end - module, view, id, suffix = string.match(path, "^/([^/]+)/([^/]+)/([^/.]+)%.([^/]+)$") + module, view, id, suffix = string.match(path, "^([^/]+)/([^/]+)/([^/.]+)%.([^/]+)$") if module then return {module = module, view = view, id = id, suffix = suffix} end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/get_action.lua --- a/framework/env/request/get_action.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/get_action.lua Wed Feb 25 01:33:27 2015 +0100 @@ -10,6 +10,6 @@ if request._forward_processed then return nil else - return request._action + return request._route.action end end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/get_id_string.lua --- a/framework/env/request/get_id_string.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/get_id_string.lua Wed Feb 25 01:33:27 2015 +0100 @@ -7,5 +7,5 @@ --]]-- function request.get_id_string() - return request._id + return request._route.id end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/get_module.lua --- a/framework/env/request/get_module.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/get_module.lua Wed Feb 25 01:33:27 2015 +0100 @@ -8,8 +8,8 @@ function request.get_module() if request._forward_processed then - return request._forward.module or request._module or 'index' + return request._forward.module or request._route.module or 'index' else - return request._module or 'index' + return request._route.module or 'index' end end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/get_param_strings.lua --- a/framework/env/request/get_param_strings.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/get_param_strings.lua Wed Feb 25 01:33:27 2015 +0100 @@ -1,19 +1,26 @@ --[[-- params = -param.get_param_strings() +request.get_param_strings() This function returns a table with all raw GET/POST parameters as strings or list of strings (except internal parameters like "_webmcp_path" or "_webmcp_id"). Modifications of the returned table have no side effects. --]]-- +local function merge_params(tbl, params_list) + for key, values in pairs(tbl) do + if string.match(key, "^_webmcp_") then + -- do nothing + elseif string.match(key, "%[%]$") then + tbl[key] = table.new(values) + else + tbl[key] = values[1] + end + end +end + function request.get_param_strings() local t = {} - for key, value in pairs(request._params) do - if type(value) == 'table' then - t[key] = table.new(value) - else - t[key] = value - end - end + merge_params(t, request._http_request.get_params_list) + merge_params(t, request._http_request.post_params_list) return t end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/get_view.lua --- a/framework/env/request/get_view.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/get_view.lua Wed Feb 25 01:33:27 2015 +0100 @@ -11,13 +11,13 @@ return request._forward.view or 'index' else if request._view then - local suffix = request._suffix or "html" + local suffix = request._route._suffix or "html" if suffix == "html" then - return request._view + return request._route._view else - return request._view .. "." .. suffix + return request._route._view .. "." .. suffix end - elseif not request._action then + elseif not request._route._action then return 'index' else return nil diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/handler.lua --- a/framework/env/request/handler.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/handler.lua Wed Feb 25 01:33:27 2015 +0100 @@ -11,20 +11,16 @@ request._http_request = http_request local path = http_request.path if path then - local elements = {} + local relative_baseurl_elements = {} for match in string.gmatch(path, "/") do - elements[#elements+1] = "../" + relative_baseurl_elements[#relative_baseurl_elements+1] = "../" end - elements[#elements] = nil - if #elements > 0 then - request._relative_baseurl = table.concat(elements) - else - request._relative_baseurl = "./" - end + request._relative_baseurl = table.concat(relative_baseurl_elements) else request._relative_baseurl = nil end - request.process(request.router()) + request._route = request.router() + request.process() end --//-- diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/is_404.lua --- a/framework/env/request/is_404.lua Sun Feb 22 17:16:13 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ ---[[-- -is_404 = -- boolean -request.is_404() - -Returns true, if this request results in a 404, else false. - ---]]-- - -function request.is_404() - return request._is_404 -end diff -r e69251d4ba0e -r 25a20bd1f416 framework/env/request/process.lua --- a/framework/env/request/process.lua Sun Feb 22 17:16:13 2015 +0100 +++ b/framework/env/request/process.lua Wed Feb 25 01:33:27 2015 +0100 @@ -10,7 +10,7 @@ end end -function request.process(route) +function request.process() local success, error_info = xpcall( function() @@ -23,15 +23,7 @@ if blob then slot.restore_all(blob) end end - - if request.is_404() then - request.set_status("404 Not Found") - if request.get_404_route() then - request.forward(request.get_404_route()) - else - error("No 404 page set.") - end - elseif request.get_action() then + if request.get_action() then trace.request{ module = request.get_module(), action = request.get_action() @@ -48,9 +40,9 @@ request.set_status("404 Not Found") request.forward(request.get_404_route()) else - if cgi.method ~= "POST" then + if request._http_request.method ~= "POST" then request.set_status("405 Method Not Allowed") - cgi.add_header("Allow: POST") + request.add_header("Allow", "POST") error("Tried to invoke an action with a GET request.") end local action_status = execute.filtered_action{