Mercurial > prosody-hg
comparison net/http/server.lua @ 10392:7a95f27ac9d6
net.http.server: Factor out handling of event response for easier reuse
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 01 Nov 2019 22:25:54 +0100 |
| parents | cd1c73c2bdec |
| children | 0ea7b4769096 |
comparison
equal
deleted
inserted
replaced
| 10391:986349fc0f9e | 10392:7a95f27ac9d6 |
|---|---|
| 168 t[k] = v; | 168 t[k] = v; |
| 169 return v; | 169 return v; |
| 170 end | 170 end |
| 171 }); | 171 }); |
| 172 | 172 |
| 173 local function handle_result(request, response, result) | |
| 174 if result == nil then | |
| 175 result = 404; | |
| 176 end | |
| 177 | |
| 178 if result == true then | |
| 179 return; | |
| 180 end | |
| 181 | |
| 182 local body; | |
| 183 local result_type = type(result); | |
| 184 if result_type == "number" then | |
| 185 response.status_code = result; | |
| 186 if result >= 400 then | |
| 187 body = events.fire_event("http-error", { request = request, response = response, code = result }); | |
| 188 end | |
| 189 elseif result_type == "string" then | |
| 190 body = result; | |
| 191 elseif result_type == "table" then | |
| 192 for k, v in pairs(result) do | |
| 193 if k ~= "headers" then | |
| 194 response[k] = v; | |
| 195 else | |
| 196 for header_name, header_value in pairs(v) do | |
| 197 response.headers[header_name] = header_value; | |
| 198 end | |
| 199 end | |
| 200 end | |
| 201 end | |
| 202 response:send(body); | |
| 203 end | |
| 204 | |
| 173 function _M.hijack_response(response, listener) -- luacheck: ignore | 205 function _M.hijack_response(response, listener) -- luacheck: ignore |
| 174 error("TODO"); | 206 error("TODO"); |
| 175 end | 207 end |
| 176 function handle_request(conn, request, finish_cb) | 208 function handle_request(conn, request, finish_cb) |
| 177 --log("debug", "handler: %s", request.path); | 209 --log("debug", "handler: %s", request.path); |
| 259 local host_head_event = "GET "..host..request.path:match("[^?]*"); | 291 local host_head_event = "GET "..host..request.path:match("[^?]*"); |
| 260 log("debug", "Firing event: %s", host_head_event); | 292 log("debug", "Firing event: %s", host_head_event); |
| 261 result = events.fire_event(host_head_event, payload); | 293 result = events.fire_event(host_head_event, payload); |
| 262 end | 294 end |
| 263 end | 295 end |
| 264 if result ~= nil then | 296 |
| 265 if result ~= true then | 297 return handle_result(request, response, result); |
| 266 local body; | 298 end |
| 267 local result_type = type(result); | 299 |
| 268 if result_type == "number" then | |
| 269 response.status_code = result; | |
| 270 if result >= 400 then | |
| 271 payload.code = result; | |
| 272 body = events.fire_event("http-error", payload); | |
| 273 end | |
| 274 elseif result_type == "string" then | |
| 275 body = result; | |
| 276 elseif result_type == "table" then | |
| 277 for k, v in pairs(result) do | |
| 278 if k ~= "headers" then | |
| 279 response[k] = v; | |
| 280 else | |
| 281 for header_name, header_value in pairs(v) do | |
| 282 response.headers[header_name] = header_value; | |
| 283 end | |
| 284 end | |
| 285 end | |
| 286 end | |
| 287 response:send(body); | |
| 288 end | |
| 289 return; | |
| 290 end | |
| 291 | |
| 292 -- if handler not called, return 404 | |
| 293 response.status_code = 404; | |
| 294 payload.code = 404; | |
| 295 response:send(events.fire_event("http-error", payload)); | |
| 296 end | |
| 297 local function prepare_header(response) | 300 local function prepare_header(response) |
| 298 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]); | 301 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]); |
| 299 local headers = response.headers; | 302 local headers = response.headers; |
| 300 local output = { status_line }; | 303 local output = { status_line }; |
| 301 for k,v in pairs(headers) do | 304 for k,v in pairs(headers) do |
