Software /
code /
prosody
Comparison
net/http.lua @ 11120:b2331f3dfeea
Merge 0.11->trunk
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 30 Sep 2020 09:50:33 +0100 |
parent | 11068:988ddd57e851 |
child | 11185:409ce7686c11 |
comparison
equal
deleted
inserted
replaced
11119:68df52bf08d5 | 11120:b2331f3dfeea |
---|---|
10 local url = require "socket.url" | 10 local url = require "socket.url" |
11 local httpstream_new = require "net.http.parser".new; | 11 local httpstream_new = require "net.http.parser".new; |
12 local util_http = require "util.http"; | 12 local util_http = require "util.http"; |
13 local events = require "util.events"; | 13 local events = require "util.events"; |
14 local verify_identity = require"util.x509".verify_identity; | 14 local verify_identity = require"util.x509".verify_identity; |
15 local promise = require "util.promise"; | |
16 local http_errors = require "net.http.errors"; | |
15 | 17 |
16 local basic_resolver = require "net.resolvers.basic"; | 18 local basic_resolver = require "net.resolvers.basic"; |
17 local connect = require "net.connect".connect; | 19 local connect = require "net.connect".connect; |
18 | 20 |
19 local ssl_available = pcall(require, "ssl"); | 21 local ssl_available = pcall(require, "ssl"); |
38 | 40 |
39 -- Request-related helper functions | 41 -- Request-related helper functions |
40 local function handleerr(err) log("error", "Traceback[http]: %s", traceback(tostring(err), 2)); return err; end | 42 local function handleerr(err) log("error", "Traceback[http]: %s", traceback(tostring(err), 2)); return err; end |
41 local function log_if_failed(req, ret, ...) | 43 local function log_if_failed(req, ret, ...) |
42 if not ret then | 44 if not ret then |
43 log("error", "Request '%s': error in callback: %s", req.id, tostring((...))); | 45 log("error", "Request '%s': error in callback: %s", req.id, (...)); |
44 if not req.suppress_errors then | 46 if not req.suppress_errors then |
45 error(...); | 47 error(...); |
46 end | 48 end |
47 end | 49 end |
48 return ...; | 50 return ...; |
159 | 161 |
160 function listener.onincoming(conn, data) | 162 function listener.onincoming(conn, data) |
161 local request = requests[conn]; | 163 local request = requests[conn]; |
162 | 164 |
163 if not request then | 165 if not request then |
164 log("warn", "Received response from connection %s with no request attached!", tostring(conn)); | 166 log("warn", "Received response from connection %s with no request attached!", conn); |
165 return; | 167 return; |
166 end | 168 end |
167 | 169 |
168 if data and request.reader then | 170 if data and request.reader then |
169 request:reader(data); | 171 request:reader(data); |
280 end | 282 end |
281 | 283 |
282 local function new(options) | 284 local function new(options) |
283 local http = { | 285 local http = { |
284 options = options; | 286 options = options; |
285 request = request; | 287 request = function (self, u, ex, callback) |
288 if callback ~= nil then | |
289 return request(self, u, ex, callback); | |
290 else | |
291 return promise.new(function (resolve, reject) | |
292 request(self, u, ex, function (body, code, a, b) | |
293 if code == 0 then | |
294 reject(http_errors.new(body, { request = a })); | |
295 else | |
296 a.request = b; | |
297 resolve(a); | |
298 end | |
299 end); | |
300 end); | |
301 end | |
302 end; | |
286 new = options and function (new_options) | 303 new = options and function (new_options) |
287 local final_options = {}; | 304 local final_options = {}; |
288 for k, v in pairs(options) do final_options[k] = v; end | 305 for k, v in pairs(options) do final_options[k] = v; end |
289 if new_options then | 306 if new_options then |
290 for k, v in pairs(new_options) do final_options[k] = v; end | 307 for k, v in pairs(new_options) do final_options[k] = v; end |
295 }; | 312 }; |
296 return http; | 313 return http; |
297 end | 314 end |
298 | 315 |
299 local default_http = new({ | 316 local default_http = new({ |
300 sslctx = { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" } }; | 317 sslctx = { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" }, alpn = "http/1.1" }; |
301 suppress_errors = true; | 318 suppress_errors = true; |
302 }); | 319 }); |
303 | 320 |
304 return { | 321 return { |
305 request = function (u, ex, callback) | 322 request = function (u, ex, callback) |