Mercurial > prosody-modules
comparison mod_http_upload/mod_http_upload.lua @ 1912:24c22cbb86e4
mod_http_upload: Duplicate code from net.http.server in order send proper HEAD responses
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 18 Oct 2015 17:25:14 +0200 |
| parents | 5849d70bcd37 |
| children | b01d60dfa405 |
comparison
equal
deleted
inserted
replaced
| 1911:0225f2a551d0 | 1912:24c22cbb86e4 |
|---|---|
| 9 | 9 |
| 10 -- imports | 10 -- imports |
| 11 local st = require"util.stanza"; | 11 local st = require"util.stanza"; |
| 12 local lfs = require"lfs"; | 12 local lfs = require"lfs"; |
| 13 local uuid = require"util.uuid".generate; | 13 local uuid = require"util.uuid".generate; |
| 14 local t_concat = table.concat; | |
| 15 local t_insert = table.insert; | |
| 14 | 16 |
| 15 local function join_path(a, b) | 17 local function join_path(a, b) |
| 16 return a .. package.config:sub(1,1) .. b; | 18 return a .. package.config:sub(1,1) .. b; |
| 17 end | 19 end |
| 18 | 20 |
| 109 module:log("info", "File uploaded by %s to slot %s", pending_slots[path], random); | 111 module:log("info", "File uploaded by %s to slot %s", pending_slots[path], random); |
| 110 pending_slots[path] = nil; | 112 pending_slots[path] = nil; |
| 111 return 200; | 113 return 200; |
| 112 end | 114 end |
| 113 | 115 |
| 114 local serve_uploaded_files = module:depends("http_files").serve(storage_path); | 116 -- FIXME Duplicated from net.http.server |
| 115 local http_server = require"net.http.server"; | |
| 116 | 117 |
| 117 local function size_only(response, body) | 118 local codes = require "net.http.codes"; |
| 118 if body then | 119 local headerfix = setmetatable({}, { |
| 119 response.headers.content_length = #body; | 120 __index = function(t, k) |
| 121 local v = "\r\n"..k:gsub("_", "-"):gsub("%f[%w].", s_upper)..": "; | |
| 122 t[k] = v; | |
| 123 return v; | |
| 120 end | 124 end |
| 121 return http_server.send_response(response); | 125 }); |
| 126 | |
| 127 local function send_response_sans_body(response, body) | |
| 128 if response.finished then return; end | |
| 129 response.finished = true; | |
| 130 response.conn._http_open_response = nil; | |
| 131 | |
| 132 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]); | |
| 133 local headers = response.headers; | |
| 134 body = body or response.body or ""; | |
| 135 headers.content_length = #body; | |
| 136 | |
| 137 local output = { status_line }; | |
| 138 for k,v in pairs(headers) do | |
| 139 t_insert(output, headerfix[k]..v); | |
| 140 end | |
| 141 t_insert(output, "\r\n\r\n"); | |
| 142 -- Here we *don't* add the body to the output | |
| 143 | |
| 144 response.conn:write(t_concat(output)); | |
| 145 if response.on_destroy then | |
| 146 response:on_destroy(); | |
| 147 response.on_destroy = nil; | |
| 148 end | |
| 149 if response.persistent then | |
| 150 response:finish_cb(); | |
| 151 else | |
| 152 response.conn:close(); | |
| 153 end | |
| 122 end | 154 end |
| 123 | 155 |
| 156 local serve_uploaded_files = module:depends("http_files").serve(storage_path); | |
| 157 | |
| 124 local function serve_head(event, path) | 158 local function serve_head(event, path) |
| 125 event.response.send = size_only; | 159 event.response.send = send_response_sans_body; |
| 126 return serve_uploaded_files(event, path); | 160 return serve_uploaded_files(event, path); |
| 127 end | 161 end |
| 128 | 162 |
| 129 module:provides("http", { | 163 module:provides("http", { |
| 130 route = { | 164 route = { |
