webmcp
annotate framework/cgi-bin/webmcp.lua @ 3:795b764629ca
Version 1.0.3
Important bugfix related to internal forwards (Bug was introduced by the restriction of views with underscore prefix in Version 1.0.2)
Important bugfix related to internal forwards (Bug was introduced by the restriction of views with underscore prefix in Version 1.0.2)
author | jbe |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | 72860d232f32 |
children | 5e32ef998acf |
rev | line source |
---|---|
jbe/bsw@0 | 1 #!/usr/bin/env lua |
jbe/bsw@0 | 2 |
jbe@3 | 3 _WEBMCP_VERSION = "1.0.3" |
jbe@1 | 4 |
jbe/bsw@0 | 5 -- include "../lib/" in search path for libraries |
jbe/bsw@0 | 6 do |
jbe/bsw@0 | 7 package.path = '../lib/?.lua;' .. package.path |
jbe/bsw@0 | 8 -- find out which file name extension shared libraries have |
jbe/bsw@0 | 9 local slib_exts = {} |
jbe/bsw@0 | 10 for ext in string.gmatch(package.cpath, "%?%.([A-Za-z0-9_-]+)") do |
jbe/bsw@0 | 11 slib_exts[ext] = true |
jbe/bsw@0 | 12 end |
jbe/bsw@0 | 13 local paths = {} |
jbe/bsw@0 | 14 for ext in pairs(slib_exts) do |
jbe/bsw@0 | 15 paths[#paths+1] = "../accelerator/?." .. ext |
jbe/bsw@0 | 16 end |
jbe/bsw@0 | 17 for ext in pairs(slib_exts) do |
jbe/bsw@0 | 18 paths[#paths+1] = "../lib/?." .. ext |
jbe/bsw@0 | 19 end |
jbe/bsw@0 | 20 paths[#paths+1] = package.cpath |
jbe/bsw@0 | 21 package.cpath = table.concat(paths, ";") |
jbe/bsw@0 | 22 end |
jbe/bsw@0 | 23 |
jbe/bsw@0 | 24 -- load os extensions for lua |
jbe/bsw@0 | 25 -- (should happen as soon as possible due to run time measurement) |
jbe/bsw@0 | 26 require 'extos' |
jbe/bsw@0 | 27 |
jbe/bsw@0 | 28 -- load nihil library |
jbe/bsw@0 | 29 require 'nihil' |
jbe/bsw@0 | 30 |
jbe/bsw@0 | 31 -- load random generator library |
jbe/bsw@0 | 32 require 'multirand' |
jbe/bsw@0 | 33 |
jbe/bsw@0 | 34 -- load rocketcgi library and map it to cgi |
jbe/bsw@0 | 35 do |
jbe/bsw@0 | 36 local option = os.getenv("WEBMCP_INTERACTIVE") |
jbe/bsw@0 | 37 if option and option ~= "" and option ~= "0" then |
jbe/bsw@0 | 38 cgi = nil |
jbe/bsw@0 | 39 else |
jbe/bsw@0 | 40 require 'rocketcgi' |
jbe/bsw@0 | 41 cgi = rocketcgi |
jbe/bsw@0 | 42 end |
jbe/bsw@0 | 43 end |
jbe/bsw@0 | 44 |
jbe/bsw@0 | 45 -- load database access library with object relational mapper |
jbe/bsw@0 | 46 require 'mondelefant' |
jbe/bsw@0 | 47 mondelefant.connection_prototype.error_objects = true |
jbe/bsw@0 | 48 |
jbe/bsw@0 | 49 -- load type system "atom" |
jbe/bsw@0 | 50 require 'atom' |
jbe/bsw@0 | 51 |
jbe/bsw@0 | 52 -- load mondelefant atom connector |
jbe/bsw@0 | 53 require 'mondelefant_atom_connector' |
jbe/bsw@0 | 54 |
jbe/bsw@0 | 55 --[[-- |
jbe/bsw@0 | 56 cloned_table = -- newly generated table |
jbe/bsw@0 | 57 table.new( |
jbe/bsw@0 | 58 table_or_nil -- keys of a given table will be copied to the new table |
jbe/bsw@0 | 59 ) |
jbe/bsw@0 | 60 |
jbe/bsw@0 | 61 If a table is given, then a cloned table is returned. |
jbe/bsw@0 | 62 If nil is given, then a new empty table is returned. |
jbe/bsw@0 | 63 |
jbe/bsw@0 | 64 --]]-- |
jbe/bsw@0 | 65 function table.new(tbl) |
jbe/bsw@0 | 66 new_tbl = {} |
jbe/bsw@0 | 67 if tbl then |
jbe/bsw@0 | 68 for key, value in pairs(tbl) do |
jbe/bsw@0 | 69 new_tbl[key] = value |
jbe/bsw@0 | 70 end |
jbe/bsw@0 | 71 end |
jbe/bsw@0 | 72 return new_tbl |
jbe/bsw@0 | 73 end |
jbe/bsw@0 | 74 --//-- |
jbe/bsw@0 | 75 |
jbe/bsw@0 | 76 --[[-- |
jbe/bsw@0 | 77 at_exit( |
jbe/bsw@0 | 78 func -- function to be called before the process is ending |
jbe/bsw@0 | 79 ) |
jbe/bsw@0 | 80 |
jbe/bsw@0 | 81 Registers a function to be called before the CGI process is exiting. |
jbe/bsw@0 | 82 --]]-- |
jbe/bsw@0 | 83 do |
jbe/bsw@0 | 84 local exit_handlers = {} |
jbe/bsw@0 | 85 function at_exit(func) |
jbe/bsw@0 | 86 table.insert(exit_handlers, func) |
jbe/bsw@0 | 87 end |
jbe/bsw@0 | 88 function exit(code) |
jbe/bsw@0 | 89 for i = #exit_handlers, 1, -1 do |
jbe/bsw@0 | 90 exit_handlers[i]() |
jbe/bsw@0 | 91 end |
jbe/bsw@0 | 92 os.exit(code) |
jbe/bsw@0 | 93 end |
jbe/bsw@0 | 94 end |
jbe/bsw@0 | 95 --//-- |
jbe/bsw@0 | 96 |
jbe/bsw@0 | 97 --[[-- |
jbe/bsw@0 | 98 app -- table to store an application state |
jbe/bsw@0 | 99 |
jbe/bsw@0 | 100 'app' is a global table for storing any application state data |
jbe/bsw@0 | 101 --]]-- |
jbe/bsw@0 | 102 app = {} |
jbe/bsw@0 | 103 --//-- |
jbe/bsw@0 | 104 |
jbe/bsw@0 | 105 --[[-- |
jbe/bsw@0 | 106 config -- table to store application configuration |
jbe/bsw@0 | 107 |
jbe/bsw@0 | 108 'config' is a global table, which can be modified by a config file of an application to modify the behaviour of that application. |
jbe/bsw@0 | 109 --]]-- |
jbe/bsw@0 | 110 config = {} |
jbe/bsw@0 | 111 --//-- |
jbe/bsw@0 | 112 |
jbe/bsw@0 | 113 -- autoloader system for WebMCP environment "../env/", |
jbe/bsw@0 | 114 -- application environment extensions "$WEBMCP_APP_BASE/env/" |
jbe/bsw@0 | 115 -- and models "$WEBMCP_APP_BASE/model/" |
jbe/bsw@0 | 116 do |
jbe/bsw@0 | 117 local app_base = os.getenv("WEBMCP_APP_BASEPATH") |
jbe/bsw@0 | 118 if not app_base then |
jbe/bsw@0 | 119 error( |
jbe/bsw@0 | 120 "Failed to initialize autoloader " .. |
jbe/bsw@0 | 121 "due to unset WEBMCP_APP_BASEPATH environment variable." |
jbe/bsw@0 | 122 ) |
jbe/bsw@0 | 123 end |
jbe/bsw@0 | 124 local weakkey_mt = { __mode = "k" } |
jbe/bsw@0 | 125 local autoloader_category = setmetatable({}, weakkey_mt) |
jbe/bsw@0 | 126 local autoloader_path = setmetatable({}, weakkey_mt) |
jbe/bsw@0 | 127 local autoloader_mt = {} |
jbe/bsw@0 | 128 local function install_autoloader(self, category, path) |
jbe/bsw@0 | 129 autoloader_category[self] = category |
jbe/bsw@0 | 130 autoloader_path[self] = path |
jbe/bsw@0 | 131 setmetatable(self, autoloader_mt) |
jbe/bsw@0 | 132 end |
jbe/bsw@0 | 133 local function try_exec(filename) |
jbe/bsw@0 | 134 local file = io.open(filename, "r") |
jbe/bsw@0 | 135 if file then |
jbe/bsw@0 | 136 local filedata = file:read("*a") |
jbe/bsw@0 | 137 io.close(file) |
jbe/bsw@0 | 138 local func, errmsg = loadstring(filedata, "=" .. filename) |
jbe/bsw@0 | 139 if func then |
jbe/bsw@0 | 140 func() |
jbe/bsw@0 | 141 return true |
jbe/bsw@0 | 142 else |
jbe/bsw@0 | 143 error(errmsg, 0) |
jbe/bsw@0 | 144 end |
jbe/bsw@0 | 145 else |
jbe/bsw@0 | 146 return false |
jbe/bsw@0 | 147 end |
jbe/bsw@0 | 148 end |
jbe/bsw@0 | 149 local function compose_path_string(base, path, key) |
jbe/bsw@0 | 150 return string.gsub( |
jbe/bsw@0 | 151 base .. table.concat(path, "/") .. "/" .. key, "/+", "/" |
jbe/bsw@0 | 152 ) |
jbe/bsw@0 | 153 end |
jbe/bsw@0 | 154 function autoloader_mt.__index(self, key) |
jbe/bsw@0 | 155 local category, base_path, merge_base_path, file_key |
jbe/bsw@0 | 156 local merge = false |
jbe/bsw@0 | 157 if |
jbe/bsw@0 | 158 string.find(key, "^[a-z_][A-Za-z0-9_]*$") and |
jbe/bsw@0 | 159 not string.find(key, "^__") |
jbe/bsw@0 | 160 then |
jbe/bsw@0 | 161 category = "env" |
jbe/bsw@0 | 162 base_path = "../env/" |
jbe/bsw@0 | 163 merge = true |
jbe/bsw@0 | 164 merge_base_path = app_base .. "/env/" |
jbe/bsw@0 | 165 file_key = key |
jbe/bsw@0 | 166 elseif string.find(key, "^[A-Z][A-Za-z0-9]*$") then |
jbe/bsw@0 | 167 category = "model" |
jbe/bsw@0 | 168 base_path = app_base .. "/model/" |
jbe/bsw@0 | 169 local first = true |
jbe/bsw@0 | 170 file_key = string.gsub(key, "[A-Z]", |
jbe/bsw@0 | 171 function(c) |
jbe/bsw@0 | 172 if first then |
jbe/bsw@0 | 173 first = false |
jbe/bsw@0 | 174 return string.lower(c) |
jbe/bsw@0 | 175 else |
jbe/bsw@0 | 176 return "_" .. string.lower(c) |
jbe/bsw@0 | 177 end |
jbe/bsw@0 | 178 end |
jbe/bsw@0 | 179 ) |
jbe/bsw@0 | 180 else |
jbe/bsw@0 | 181 return |
jbe/bsw@0 | 182 end |
jbe/bsw@0 | 183 local required_category = autoloader_category[self] |
jbe/bsw@0 | 184 if required_category and required_category ~= category then return end |
jbe/bsw@0 | 185 local path = autoloader_path[self] |
jbe/bsw@0 | 186 local path_string = compose_path_string(base_path, path, file_key) |
jbe/bsw@0 | 187 local merge_path_string |
jbe/bsw@0 | 188 if merge then |
jbe/bsw@0 | 189 merge_path_string = compose_path_string( |
jbe/bsw@0 | 190 merge_base_path, path, file_key |
jbe/bsw@0 | 191 ) |
jbe/bsw@0 | 192 end |
jbe/bsw@0 | 193 local function try_dir(dirname) |
jbe/bsw@0 | 194 local dir = io.open(dirname) |
jbe/bsw@0 | 195 if dir then |
jbe/bsw@0 | 196 io.close(dir) |
jbe/bsw@0 | 197 local obj = {} |
jbe/bsw@0 | 198 local sub_path = {} |
jbe/bsw@0 | 199 for i, v in ipairs(path) do sub_path[i] = v end |
jbe/bsw@0 | 200 table.insert(sub_path, file_key) |
jbe/bsw@0 | 201 install_autoloader(obj, category, sub_path) |
jbe/bsw@0 | 202 rawset(self, key, obj) |
jbe/bsw@0 | 203 try_exec(path_string .. "/__init.lua") |
jbe/bsw@0 | 204 if merge then try_exec(merge_path_string .. "/__init.lua") end |
jbe/bsw@0 | 205 return true |
jbe/bsw@0 | 206 else |
jbe/bsw@0 | 207 return false |
jbe/bsw@0 | 208 end |
jbe/bsw@0 | 209 end |
jbe/bsw@0 | 210 if merge and try_exec(merge_path_string .. ".lua") then |
jbe/bsw@0 | 211 elseif merge and try_dir(merge_path_string .. "/") then |
jbe/bsw@0 | 212 elseif try_exec(path_string .. ".lua") then |
jbe/bsw@0 | 213 elseif try_dir(path_string .. "/") then |
jbe/bsw@0 | 214 else end |
jbe/bsw@0 | 215 return rawget(self, key) |
jbe/bsw@0 | 216 end |
jbe/bsw@0 | 217 install_autoloader(_G, nil, {}) |
jbe/bsw@0 | 218 try_exec("../env/__init.lua") |
jbe/bsw@0 | 219 end |
jbe/bsw@0 | 220 |
jbe/bsw@0 | 221 -- interactive console mode |
jbe/bsw@0 | 222 if not cgi then |
jbe/bsw@0 | 223 local config_name = request.get_config_name() |
jbe/bsw@0 | 224 if config_name then |
jbe/bsw@0 | 225 execute.config(config_name) |
jbe/bsw@0 | 226 end |
jbe/bsw@0 | 227 return |
jbe/bsw@0 | 228 end |
jbe/bsw@0 | 229 |
jbe/bsw@0 | 230 local success, error_info = xpcall( |
jbe/bsw@0 | 231 function() |
jbe/bsw@0 | 232 |
jbe/bsw@0 | 233 -- execute configuration file |
jbe/bsw@0 | 234 do |
jbe/bsw@0 | 235 local config_name = request.get_config_name() |
jbe/bsw@0 | 236 if config_name then |
jbe/bsw@0 | 237 execute.config(config_name) |
jbe/bsw@0 | 238 end |
jbe/bsw@0 | 239 end |
jbe/bsw@0 | 240 |
jbe/bsw@0 | 241 -- restore slots if coming from http redirect |
jbe/bsw@0 | 242 if cgi.params.tempstore then |
jbe/bsw@0 | 243 trace.restore_slots{} |
jbe/bsw@0 | 244 local blob = tempstore.pop(cgi.params.tempstore) |
jbe/bsw@0 | 245 if blob then slot.restore_all(blob) end |
jbe/bsw@0 | 246 end |
jbe/bsw@0 | 247 |
jbe/bsw@0 | 248 local function file_exists(filename) |
jbe/bsw@0 | 249 local file = io.open(filename, "r") |
jbe/bsw@0 | 250 if file then |
jbe/bsw@0 | 251 io.close(file) |
jbe/bsw@0 | 252 return true |
jbe/bsw@0 | 253 else |
jbe/bsw@0 | 254 return false |
jbe/bsw@0 | 255 end |
jbe/bsw@0 | 256 end |
jbe/bsw@0 | 257 |
jbe/bsw@0 | 258 if cgi.params["_webmcp_404"] then |
jbe/bsw@0 | 259 request.force_absolute_baseurl() |
jbe/bsw@0 | 260 request.set_status("404 Not Found") |
jbe/bsw@0 | 261 if request.get_404_route() then |
jbe/bsw@0 | 262 request.forward(request.get_404_route()) |
jbe/bsw@0 | 263 else |
jbe/bsw@0 | 264 error("No 404 page set.") |
jbe/bsw@0 | 265 end |
jbe/bsw@0 | 266 elseif request.get_action() then |
jbe/bsw@0 | 267 trace.request{ |
jbe/bsw@0 | 268 module = request.get_module(), |
jbe/bsw@0 | 269 action = request.get_action() |
jbe/bsw@0 | 270 } |
jbe/bsw@0 | 271 if |
jbe/bsw@0 | 272 request.get_404_route() and |
jbe/bsw@0 | 273 not file_exists( |
jbe/bsw@0 | 274 encode.action_file_path{ |
jbe/bsw@0 | 275 module = request.get_module(), |
jbe/bsw@0 | 276 action = request.get_action() |
jbe/bsw@0 | 277 } |
jbe/bsw@0 | 278 ) |
jbe/bsw@0 | 279 then |
jbe/bsw@0 | 280 request.set_status("404 Not Found") |
jbe/bsw@0 | 281 request.forward(request.get_404_route()) |
jbe/bsw@0 | 282 else |
jbe/bsw@0 | 283 if cgi.method ~= "POST" then |
jbe/bsw@0 | 284 request.set_status("405 Method Not Allowed") |
jbe/bsw@0 | 285 cgi.add_header("Allow: POST") |
jbe/bsw@0 | 286 error("Tried to invoke an action with a GET request.") |
jbe/bsw@0 | 287 end |
jbe/bsw@0 | 288 local action_status = execute.filtered_action{ |
jbe/bsw@0 | 289 module = request.get_module(), |
jbe/bsw@0 | 290 action = request.get_action(), |
jbe/bsw@0 | 291 } |
jbe/bsw@0 | 292 if not request.is_rerouted() then |
jbe/bsw@0 | 293 local routing_mode, routing_module, routing_view |
jbe/bsw@0 | 294 routing_mode = cgi.params["_webmcp_routing." .. action_status .. ".mode"] |
jbe/bsw@0 | 295 routing_module = cgi.params["_webmcp_routing." .. action_status .. ".module"] |
jbe/bsw@0 | 296 routing_view = cgi.params["_webmcp_routing." .. action_status .. ".view"] |
jbe/bsw@0 | 297 if not (routing_mode or routing_module or routing_view) then |
jbe/bsw@0 | 298 action_status = "default" |
jbe/bsw@0 | 299 routing_mode = cgi.params["_webmcp_routing.default.mode"] |
jbe/bsw@0 | 300 routing_module = cgi.params["_webmcp_routing.default.module"] |
jbe/bsw@0 | 301 routing_view = cgi.params["_webmcp_routing.default.view"] |
jbe/bsw@0 | 302 end |
jbe/bsw@0 | 303 assert(routing_module, "Routing information has no module.") |
jbe/bsw@0 | 304 assert(routing_view, "Routing information has no view.") |
jbe/bsw@0 | 305 if routing_mode == "redirect" then |
jbe/bsw@0 | 306 local routing_params = {} |
jbe/bsw@0 | 307 for key, value in pairs(cgi.params) do |
jbe/bsw@0 | 308 local status, stripped_key = string.match( |
jbe/bsw@0 | 309 key, "^_webmcp_routing%.([^%.]*)%.params%.(.*)$" |
jbe/bsw@0 | 310 ) |
jbe/bsw@0 | 311 if status == action_status then |
jbe/bsw@0 | 312 routing_params[stripped_key] = value |
jbe/bsw@0 | 313 end |
jbe/bsw@0 | 314 end |
jbe/bsw@0 | 315 request.redirect{ |
jbe/bsw@0 | 316 module = routing_module, |
jbe/bsw@0 | 317 view = routing_view, |
jbe/bsw@0 | 318 id = cgi.params["_webmcp_routing." .. action_status .. ".id"], |
jbe/bsw@0 | 319 params = routing_params |
jbe/bsw@0 | 320 } |
jbe/bsw@0 | 321 elseif routing_mode == "forward" then |
jbe/bsw@0 | 322 request.forward{ module = routing_module, view = routing_view } |
jbe/bsw@0 | 323 else |
jbe/bsw@0 | 324 error("Missing or unknown routing mode in request parameters.") |
jbe/bsw@0 | 325 end |
jbe/bsw@0 | 326 end |
jbe/bsw@0 | 327 end |
jbe/bsw@0 | 328 else |
jbe/bsw@0 | 329 -- no action |
jbe/bsw@0 | 330 trace.request{ |
jbe/bsw@0 | 331 module = request.get_module(), |
jbe/bsw@0 | 332 view = request.get_view() |
jbe/bsw@0 | 333 } |
jbe/bsw@0 | 334 if |
jbe/bsw@0 | 335 request.get_404_route() and |
jbe/bsw@0 | 336 not file_exists( |
jbe/bsw@0 | 337 encode.view_file_path{ |
jbe/bsw@0 | 338 module = request.get_module(), |
jbe/bsw@0 | 339 view = request.get_view() |
jbe/bsw@0 | 340 } |
jbe/bsw@0 | 341 ) |
jbe/bsw@0 | 342 then |
jbe/bsw@0 | 343 request.set_status("404 Not Found") |
jbe/bsw@0 | 344 request.forward(request.get_404_route()) |
jbe/bsw@0 | 345 end |
jbe/bsw@0 | 346 end |
jbe/bsw@0 | 347 |
jbe/bsw@0 | 348 if not request.get_redirect_data() then |
jbe@3 | 349 request.process_forward() |
jbe/bsw@2 | 350 local view = request.get_view() |
jbe/bsw@2 | 351 if string.find(view, "^_") then |
jbe/bsw@2 | 352 error("Tried to call a private view (prefixed with underscore).") |
jbe/bsw@2 | 353 end |
jbe/bsw@0 | 354 execute.filtered_view{ |
jbe/bsw@0 | 355 module = request.get_module(), |
jbe/bsw@2 | 356 view = view, |
jbe/bsw@0 | 357 } |
jbe/bsw@0 | 358 end |
jbe/bsw@0 | 359 |
jbe/bsw@0 | 360 -- force error due to missing absolute base URL until its too late to display error message |
jbe/bsw@0 | 361 --if request.get_redirect_data() then |
jbe/bsw@0 | 362 -- request.get_absolute_baseurl() |
jbe/bsw@0 | 363 --end |
jbe/bsw@0 | 364 |
jbe/bsw@0 | 365 end, |
jbe/bsw@0 | 366 |
jbe/bsw@0 | 367 function(errobj) |
jbe/bsw@0 | 368 return { |
jbe/bsw@0 | 369 errobj = errobj, |
jbe/bsw@0 | 370 stacktrace = string.gsub( |
jbe/bsw@0 | 371 debug.traceback('', 2), |
jbe/bsw@0 | 372 "^\r?\n?stack traceback:\r?\n?", "" |
jbe/bsw@0 | 373 ) |
jbe/bsw@0 | 374 } |
jbe/bsw@0 | 375 end |
jbe/bsw@0 | 376 ) |
jbe/bsw@0 | 377 |
jbe/bsw@0 | 378 if not success then trace.error{} end |
jbe/bsw@0 | 379 |
jbe/bsw@0 | 380 -- laufzeitermittlung |
jbe/bsw@0 | 381 trace.exectime{ real = os.monotonic_hires_time(), cpu = os.clock() } |
jbe/bsw@0 | 382 |
jbe/bsw@0 | 383 slot.select('trace', trace.render) -- render trace information |
jbe/bsw@0 | 384 |
jbe/bsw@0 | 385 local redirect_data = request.get_redirect_data() |
jbe/bsw@0 | 386 |
jbe/bsw@0 | 387 -- log error and switch to error layout, unless success |
jbe/bsw@0 | 388 if not success then |
jbe/bsw@0 | 389 local errobj = error_info.errobj |
jbe/bsw@0 | 390 local stacktrace = error_info.stacktrace |
jbe/bsw@0 | 391 if not request.get_status() then |
jbe/bsw@0 | 392 request.set_status("500 Internal Server Error") |
jbe/bsw@0 | 393 end |
jbe/bsw@0 | 394 slot.set_layout('system_error') |
jbe/bsw@0 | 395 slot.select('system_error', function() |
jbe/bsw@0 | 396 if getmetatable(errobj) == mondelefant.errorobject_metatable then |
jbe/bsw@0 | 397 slot.put( |
jbe/bsw@0 | 398 "<p>Database error of class <b>", |
jbe/bsw@0 | 399 encode.html(errobj.code), |
jbe/bsw@0 | 400 "</b> occured:<br/><b>", |
jbe/bsw@0 | 401 encode.html(errobj.message), |
jbe/bsw@0 | 402 "</b></p>" |
jbe/bsw@0 | 403 ) |
jbe/bsw@0 | 404 else |
jbe/bsw@0 | 405 slot.put("<p><b>", encode.html(tostring(errobj)), "</b></p>") |
jbe/bsw@0 | 406 end |
jbe/bsw@0 | 407 slot.put("<p>Stack trace follows:<br/>") |
jbe/bsw@0 | 408 slot.put(encode.html_newlines(encode.html(stacktrace))) |
jbe/bsw@0 | 409 slot.put("</p>") |
jbe/bsw@0 | 410 end) |
jbe/bsw@0 | 411 elseif redirect_data then |
jbe/bsw@0 | 412 local redirect_params = {} |
jbe/bsw@0 | 413 for key, value in pairs(redirect_data.params) do |
jbe/bsw@0 | 414 redirect_params[key] = value |
jbe/bsw@0 | 415 end |
jbe/bsw@0 | 416 local slot_dump = slot.dump_all() |
jbe/bsw@0 | 417 if slot_dump ~= "" then |
jbe/bsw@0 | 418 redirect_params.tempstore = tempstore.save(slot_dump) |
jbe/bsw@0 | 419 end |
jbe/bsw@0 | 420 cgi.redirect( |
jbe/bsw@0 | 421 encode.url{ |
jbe/bsw@0 | 422 base = request.get_absolute_baseurl(), |
jbe/bsw@0 | 423 module = redirect_data.module, |
jbe/bsw@0 | 424 view = redirect_data.view, |
jbe/bsw@0 | 425 id = redirect_data.id, |
jbe/bsw@0 | 426 params = redirect_params |
jbe/bsw@0 | 427 } |
jbe/bsw@0 | 428 ) |
jbe/bsw@0 | 429 cgi.send_data() |
jbe/bsw@0 | 430 end |
jbe/bsw@0 | 431 |
jbe/bsw@0 | 432 if not success or not redirect_data then |
jbe/bsw@0 | 433 |
jbe/bsw@0 | 434 local http_status = request.get_status() |
jbe/bsw@0 | 435 if http_status then |
jbe/bsw@0 | 436 cgi.set_status(http_status) |
jbe/bsw@0 | 437 end |
jbe/bsw@0 | 438 |
jbe@1 | 439 local json_request_slots = request.get_json_request_slots() |
jbe@1 | 440 if json_request_slots then |
jbe@1 | 441 cgi.set_content_type('application/json') |
jbe@1 | 442 local data = {} |
jbe@1 | 443 for idx, slot_ident in ipairs(json_request_slots) do |
jbe@1 | 444 data[slot_ident] = slot.get_content(slot_ident) |
jbe/bsw@0 | 445 end |
jbe@1 | 446 cgi.send_data(encode.json(data)) |
jbe/bsw@0 | 447 else |
jbe/bsw@0 | 448 cgi.set_content_type(slot.get_content_type()) |
jbe/bsw@0 | 449 cgi.send_data(slot.render_layout()) |
jbe/bsw@0 | 450 end |
jbe/bsw@0 | 451 end |
jbe/bsw@0 | 452 |
jbe/bsw@0 | 453 exit() |