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 = { |