Comparison

net/http.lua @ 8201:a0ad62a269df

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Mon, 28 Aug 2017 21:05:12 +0200
parent 8121:a33a87f13155
parent 8200:e92585ab4998
child 8534:c071cabfa066
comparison
equal deleted inserted replaced
8185:e89320b8a789 8201:a0ad62a269df
9 local b64 = require "util.encodings".base64.encode; 9 local b64 = require "util.encodings".base64.encode;
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 15
15 local ssl_available = pcall(require, "ssl"); 16 local ssl_available = pcall(require, "ssl");
16 17
17 local server = require "net.server" 18 local server = require "net.server"
18 19
32 33
33 local listener = { default_port = 80, default_mode = "*a" }; 34 local listener = { default_port = 80, default_mode = "*a" };
34 35
35 function listener.onconnect(conn) 36 function listener.onconnect(conn)
36 local req = requests[conn]; 37 local req = requests[conn];
38
39 -- Validate certificate
40 if not req.insecure and conn:ssl() then
41 local sock = conn:socket();
42 local chain_valid = sock.getpeerverification and sock:getpeerverification();
43 if not chain_valid then
44 req.callback("certificate-chain-invalid", 0, req);
45 req.callback = nil;
46 conn:close();
47 return;
48 end
49 local cert = sock.getpeercertificate and sock:getpeercertificate();
50 if not cert or not verify_identity(req.host, false, cert) then
51 req.callback("certificate-verify-failed", 0, req);
52 req.callback = nil;
53 conn:close();
54 return;
55 end
56 end
57
37 -- Send the request 58 -- Send the request
38 local request_line = { req.method or "GET", " ", req.path, " HTTP/1.1\r\n" }; 59 local request_line = { req.method or "GET", " ", req.path, " HTTP/1.1\r\n" };
39 if req.query then 60 if req.query then
40 t_insert(request_line, 4, "?"..req.query); 61 t_insert(request_line, 4, "?"..req.query);
41 end 62 end
179 if ex.headers then 200 if ex.headers then
180 for k, v in pairs(ex.headers) do 201 for k, v in pairs(ex.headers) do
181 headers[k] = v; 202 headers[k] = v;
182 end 203 end
183 end 204 end
205 req.insecure = ex.insecure;
184 end 206 end
185 207
186 log("debug", "Making %s %s request '%s' to %s", req.scheme:upper(), method or "GET", req.id, (ex and ex.suppress_url and host_header) or u); 208 log("debug", "Making %s %s request '%s' to %s", req.scheme:upper(), method or "GET", req.id, (ex and ex.suppress_url and host_header) or u);
187 209
188 -- Attach to request object 210 -- Attach to request object
194 end 216 end
195 local port_number = port and tonumber(port) or (using_https and 443 or 80); 217 local port_number = port and tonumber(port) or (using_https and 443 or 80);
196 218
197 local sslctx = false; 219 local sslctx = false;
198 if using_https then 220 if using_https then
199 sslctx = ex and ex.sslctx or { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" } }; 221 sslctx = ex and ex.sslctx or self.options and self.options.sslctx;
200 end 222 end
201 223
202 local handler, conn = server.addclient(host, port_number, listener, "*a", sslctx) 224 local handler, conn = server.addclient(host, port_number, listener, "*a", sslctx)
203 if not handler then 225 if not handler then
204 self.events.fire_event("request-connection-error", { http = self, request = req, url = u, err = conn }); 226 self.events.fire_event("request-connection-error", { http = self, request = req, url = u, err = conn });
233 request = request; 255 request = request;
234 new = options and function (new_options) 256 new = options and function (new_options)
235 return new(setmetatable(new_options, { __index = options })); 257 return new(setmetatable(new_options, { __index = options }));
236 end or new; 258 end or new;
237 events = events.new(); 259 events = events.new();
238 request = request;
239 }; 260 };
240 return http; 261 return http;
241 end 262 end
242 263
243 local default_http = new(); 264 local default_http = new({
265 sslctx = { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" } };
266 });
244 267
245 return { 268 return {
246 request = function (u, ex, callback) 269 request = function (u, ex, callback)
247 return default_http:request(u, ex, callback); 270 return default_http:request(u, ex, callback);
248 end; 271 end;
272 default = default_http;
249 new = new; 273 new = new;
250 events = default_http.events; 274 events = default_http.events;
251 -- COMPAT 275 -- COMPAT
252 urlencode = util_http.urlencode; 276 urlencode = util_http.urlencode;
253 urldecode = util_http.urldecode; 277 urldecode = util_http.urldecode;