Annotate

net/http.lua @ 7567:495de404a8ae

ejabberdsql2prosody: rename variable 'host' to prevent shadowing upvalue [luacheck] Functions roster(), roster_pending(), roster_group(), private_storage() and offline_msg() have argument named "host", which used to shadow upvalue of this variable before this change. Instead of renaming this argument, let's rename the variable to match what the script says in usage: Usage: ejabberdsql2prosody.lua filename.txt hostname
author Anton Shestakov <av6@dwimlabs.net>
date Fri, 12 Aug 2016 13:44:47 +0800
parent 7520:fc6c24cb3599
child 7523:3c40b972260e
child 7792:0bc6c3704973
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1331
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2810
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2810
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1331
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1331
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1331
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1331
diff changeset
8
4972
1777271a1ec0 net.http: Use base64 from util.encodings instead of luasocket
Kim Alvefur <zash@zash.se>
parents: 4865
diff changeset
9 local b64 = require "util.encodings".base64.encode;
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local url = require "socket.url"
5464
712dbe1a0146 net.http: Switch from util.httpstream to net.http.parser, introduces small but backwards-incompatible API changes - see http://prosody.im/doc/developers/http
Matthew Wild <mwild1@gmail.com>
parents: 5458
diff changeset
11 local httpstream_new = require "net.http.parser".new;
5458
84162b81c863 net.http, util.http: Move definitions of urlencode/decode and formencode/decode to util.http (possible to use them without unnecessary network-related dependencies)
Matthew Wild <mwild1@gmail.com>
parents: 5448
diff changeset
12 local util_http = require "util.http";
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
5448
cbe9fa2d3787 net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents: 5354
diff changeset
14 local ssl_available = pcall(require, "ssl");
cbe9fa2d3787 net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents: 5354
diff changeset
15
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local server = require "net.server"
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local t_insert, t_concat = table.insert, table.concat;
5505
0b6a99e6c1b1 mod_c2s, mod_s2s, net.http, net.http.server: Improve tracebacks (omit traceback function), to make it clearer where an error occured
Matthew Wild <mwild1@gmail.com>
parents: 5488
diff changeset
19 local pairs = pairs;
0b6a99e6c1b1 mod_c2s, mod_s2s, net.http, net.http.server: Improve tracebacks (omit traceback function), to make it clearer where an error occured
Matthew Wild <mwild1@gmail.com>
parents: 5488
diff changeset
20 local tonumber, tostring, xpcall, select, traceback =
0b6a99e6c1b1 mod_c2s, mod_s2s, net.http, net.http.server: Improve tracebacks (omit traceback function), to make it clearer where an error occured
Matthew Wild <mwild1@gmail.com>
parents: 5488
diff changeset
21 tonumber, tostring, xpcall, select, debug.traceback;
5948
1341384628ec net.http: assert() for socket creation success so it doesn't silently fail (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 5714
diff changeset
22 local assert, error = assert, error
678
1859edec2237 Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents: 677
diff changeset
23
1859edec2237 Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents: 677
diff changeset
24 local log = require "util.logger".init("http");
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
6780
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
26 local _ENV = nil;
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
28 local requests = {}; -- Open requests
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
29
7463
3b6e7ce9431f net.http: Add request.id to every request object (can be overridden by providing ex.id)
Matthew Wild <mwild1@gmail.com>
parents: 6823
diff changeset
30 local function make_id(req) return (tostring(req):match("%x+$")); end
3b6e7ce9431f net.http: Add request.id to every request object (can be overridden by providing ex.id)
Matthew Wild <mwild1@gmail.com>
parents: 6823
diff changeset
31
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
32 local listener = { default_port = 80, default_mode = "*a" };
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
33
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
34 function listener.onconnect(conn)
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
35 local req = requests[conn];
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
36 -- Send the request
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
37 local request_line = { req.method or "GET", " ", req.path, " HTTP/1.1\r\n" };
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
38 if req.query then
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
39 t_insert(request_line, 4, "?"..req.query);
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
40 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
41
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
42 conn:write(t_concat(request_line));
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
43 local t = { [2] = ": ", [4] = "\r\n" };
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
44 for k, v in pairs(req.headers) do
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
45 t[1], t[3] = k, v;
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
46 conn:write(t_concat(t));
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
47 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
48 conn:write("\r\n");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
49
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
50 if req.body then
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
51 conn:write(req.body);
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
52 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
53 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
54
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
55 function listener.onincoming(conn, data)
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
56 local request = requests[conn];
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
57
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
58 if not request then
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
59 log("warn", "Received response from connection %s with no request attached!", tostring(conn));
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
60 return;
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
61 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
62
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
63 if data and request.reader then
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
64 request:reader(data);
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
65 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
66 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
67
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
68 function listener.ondisconnect(conn, err)
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
69 local request = requests[conn];
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
70 if request and request.conn then
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
71 request:reader(nil, err);
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
72 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
73 requests[conn] = nil;
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
74 end
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
75
6380
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5948
diff changeset
76 function listener.ondetach(conn)
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5948
diff changeset
77 requests[conn] = nil;
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5948
diff changeset
78 end
4220ffb87b22 net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents: 5948
diff changeset
79
6780
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
80 local function destroy_request(request)
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
81 if request.conn then
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
82 request.conn = nil;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
83 request.handler:close()
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
84 end
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
85 end
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
86
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
87 local function request_reader(request, data, err)
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
88 if not request.parser then
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
89 local function error_cb(reason)
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 if request.callback then
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
91 request.callback(reason or "connection-closed", 0, request);
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
92 request.callback = nil;
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 end
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 destroy_request(request);
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
96
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
97 if not data then
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
98 error_cb(err);
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
99 return;
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
100 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
101
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
102 local function success_cb(r)
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
103 if request.callback then
5488
0880a079d830 net.http: When HTTP request fails due to a network or SSL error, call the callback to let it know
Matthew Wild <mwild1@gmail.com>
parents: 5466
diff changeset
104 request.callback(r.body, r.code, r, request);
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
105 request.callback = nil;
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
106 end
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
107 destroy_request(request);
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
109 local function options_cb()
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
110 return request;
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
111 end
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
112 request.parser = httpstream_new(success_cb, error_cb, "client", options_cb);
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
3569
f30da46e0add net.http: Removed old HTTP parser, and updated to use util.httpstream.
Waqas Hussain <waqas20@gmail.com>
parents: 3540
diff changeset
114 request.parser:feed(data);
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 end
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116
5505
0b6a99e6c1b1 mod_c2s, mod_s2s, net.http, net.http.server: Improve tracebacks (omit traceback function), to make it clearer where an error occured
Matthew Wild <mwild1@gmail.com>
parents: 5488
diff changeset
117 local function handleerr(err) log("error", "Traceback[http]: %s", traceback(tostring(err), 2)); end
7464
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
118 local function log_if_failed(id, ret, ...)
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
119 if not ret then
7520
fc6c24cb3599 net.http: Add quotes around ids in log messages
Matthew Wild <mwild1@gmail.com>
parents: 7464
diff changeset
120 log("error", "Request '%s': error in callback: %s", id, tostring((...)));
7464
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
121 end
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
122 return ...;
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
123 end
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
124
6780
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
125 local function request(u, ex, callback)
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 local req = url.parse(u);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
127
903
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
128 if not (req and req.host) then
923
c63f9bc45a85 Fixed: net/http.lua: HTTP request callback wasn't being called on some errors
Waqas Hussain <waqas20@gmail.com>
parents: 903
diff changeset
129 callback(nil, 0, req);
903
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
130 return nil, "invalid-url";
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
131 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
132
903
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
133 if not req.path then
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
134 req.path = "/";
6737d005a84a net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
135 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
136
7463
3b6e7ce9431f net.http: Add request.id to every request object (can be overridden by providing ex.id)
Matthew Wild <mwild1@gmail.com>
parents: 6823
diff changeset
137 req.id = ex and ex.id or make_id(req);
3b6e7ce9431f net.http: Add request.id to every request object (can be overridden by providing ex.id)
Matthew Wild <mwild1@gmail.com>
parents: 6823
diff changeset
138
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
139 local method, headers, body;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
140
5714
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
141 local host, port = req.host, req.port;
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
142 local host_header = host;
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
143 if (port == "80" and req.scheme == "http")
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
144 or (port == "443" and req.scheme == "https") then
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
145 port = nil;
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
146 elseif port then
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
147 host_header = host_header..":"..port;
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
148 end
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
149
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
150 headers = {
5714
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
151 ["Host"] = host_header;
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
152 ["User-Agent"] = "Prosody XMPP Server";
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
153 };
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
154
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 if req.userinfo then
4972
1777271a1ec0 net.http: Use base64 from util.encodings instead of luasocket
Kim Alvefur <zash@zash.se>
parents: 4865
diff changeset
156 headers["Authorization"] = "Basic "..b64(req.userinfo);
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 end
4351
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
158
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 if ex then
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 req.onlystatus = ex.onlystatus;
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 body = ex.body;
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 if body then
4369
3578ff5d3674 net.http: Remove extra space after method in request status line for POST.
Waqas Hussain <waqas20@gmail.com>
parents: 4356
diff changeset
163 method = "POST";
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
164 headers["Content-Length"] = tostring(#body);
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
165 headers["Content-Type"] = "application/x-www-form-urlencoded";
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
4351
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
167 if ex.method then method = ex.method; end
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
168 if ex.headers then
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
169 for k, v in pairs(ex.headers) do
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
170 headers[k] = v;
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
171 end
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
172 end
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
174
7520
fc6c24cb3599 net.http: Add quotes around ids in log messages
Matthew Wild <mwild1@gmail.com>
parents: 7464
diff changeset
175 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);
7464
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
176
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
177 -- Attach to request object
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
178 req.method, req.headers, req.body = method, headers, body;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
179
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
180 local using_https = req.scheme == "https";
5448
cbe9fa2d3787 net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents: 5354
diff changeset
181 if using_https and not ssl_available then
cbe9fa2d3787 net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents: 5354
diff changeset
182 error("SSL not available, unable to contact https URL");
cbe9fa2d3787 net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents: 5354
diff changeset
183 end
5714
520671c3159c net.http: Include port number (when non-standard) in the Host header of outgoing requests, as per the HTTP RFC
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
184 local port_number = port and tonumber(port) or (using_https and 443 or 80);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
185
5353
8c3f28f5c1c1 net.http: Allow passing an SSL context or options table to be used for HTTPS requests (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 4977
diff changeset
186 local sslctx = false;
8c3f28f5c1c1 net.http: Allow passing an SSL context or options table to be used for HTTPS requests (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 4977
diff changeset
187 if using_https then
6496
e4b998ffc922 certmanager, net.http: Disable SSLv3 by default
Matthew Wild <mwild1@gmail.com>
parents: 6380
diff changeset
188 sslctx = ex and ex.sslctx or { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" } };
5353
8c3f28f5c1c1 net.http: Allow passing an SSL context or options table to be used for HTTPS requests (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 4977
diff changeset
189 end
8c3f28f5c1c1 net.http: Allow passing an SSL context or options table to be used for HTTPS requests (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 4977
diff changeset
190
6823
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
191 local handler, conn = server.addclient(host, port_number, listener, "*a", sslctx)
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
192 if not handler then
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
193 callback(nil, 0, req);
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
194 return nil, conn;
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
195 end
3b07f38d70f5 net/http: Use server.addclient
daurnimator <quae@daurnimator.com>
parents: 6780
diff changeset
196 req.handler, req.conn = handler, conn
4352
912a49b1c4e3 net.http, httpclient_listener: Move request sending from net.http to onconnect() handler, and add support for HTTPS requests to net.http
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
197 req.write = function (...) return req.handler:write(...); end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5714
diff changeset
198
7464
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
199 req.callback = function (content, code, request, response)
7520
fc6c24cb3599 net.http: Add quotes around ids in log messages
Matthew Wild <mwild1@gmail.com>
parents: 7464
diff changeset
200 log("debug", "Request '%s': Calling callback, status %s", req.id, code or "---");
7464
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
201 return log_if_failed(req.id, xpcall(function () return callback(content, code, request, response) end, handleerr));
3b7de72e58a9 net.http: Add log messages for requests, including their id (so "calling callback" and tracebacks can be traced back to their initial request)
Matthew Wild <mwild1@gmail.com>
parents: 7463
diff changeset
202 end
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 req.reader = request_reader;
678
1859edec2237 Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents: 677
diff changeset
204 req.state = "status";
4351
3f414091a008 net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
205
4557
2abe4e541d52 net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents: 4471
diff changeset
206 requests[req.handler] = req;
616
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 return req;
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 end
69bc5782b25e Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209
6780
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
210 return {
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
211 request = request;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
212
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
213 -- COMPAT
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
214 urlencode = util_http.urlencode;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
215 urldecode = util_http.urldecode;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
216 formencode = util_http.formencode;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
217 formdecode = util_http.formdecode;
647adfd8f738 net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6501
diff changeset
218 };