Software /
code /
prosody
Annotate
net/http.lua @ 13114:025c38ee885d
util.dependencies: Print tables itself to reduce number of imports
Rationale: See diffstat
When this module is imported, it ends up calling stty via term_width()
in util.human.io.table(). When this happens outside of a terminal, the
following message is sent to stdout:
stty: 'standard input': Inappropriate ioctl for device
Not importing this module avoids that.
Furthermore three is value in this module having minimal dependencies as
they might not be available when it does the checks.
Ref a1fed82c44b9
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 26 May 2023 21:18:27 +0200 |
parent | 12974:ba409c67353b |
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 |
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
9 local b64 = require "prosody.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" |
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
11 local httpstream_new = require "prosody.net.http.parser".new; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
12 local util_http = require "prosody.util.http"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
13 local events = require "prosody.util.events"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
14 local verify_identity = require"prosody.util.x509".verify_identity; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
15 local promise = require "prosody.util.promise"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
16 local http_errors = require "prosody.net.http.errors"; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
18 local basic_resolver = require "prosody.net.resolvers.basic"; |
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
19 local connect = require "prosody.net.connect".connect; |
5448
cbe9fa2d3787
net.http: Throw error when connecting to a http:// URL without LuaSec available
Matthew Wild <mwild1@gmail.com>
parents:
5354
diff
changeset
|
20 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
21 local ssl_available = pcall(require, "ssl"); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 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
|
24 local pairs = pairs; |
9562
acf74ad0b795
Many things: switch from hacky multi-arg xpcall implementations to a standard util.xpcall
Matthew Wild <mwild1@gmail.com>
parents:
8731
diff
changeset
|
25 local tonumber, tostring, traceback = |
acf74ad0b795
Many things: switch from hacky multi-arg xpcall implementations to a standard util.xpcall
Matthew Wild <mwild1@gmail.com>
parents:
8731
diff
changeset
|
26 tonumber, tostring, debug.traceback; |
11220
9b25eecde9e6
net.http: track time of request for debug/stats purposes
Matthew Wild <mwild1@gmail.com>
parents:
11185
diff
changeset
|
27 local os_time = os.time; |
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
28 local xpcall = require "prosody.util.xpcall".xpcall; |
7792
0bc6c3704973
net.http: Remove unused imports [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7520
diff
changeset
|
29 local error = error |
678
1859edec2237
Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents:
677
diff
changeset
|
30 |
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12881
diff
changeset
|
31 local log = require "prosody.util.logger".init("http"); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
6780
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
33 local _ENV = nil; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8551
diff
changeset
|
34 -- luacheck: std none |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
36 local requests = {}; -- Open requests |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
37 |
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
|
38 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
|
39 |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
40 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
|
41 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
42 -- Request-related helper functions |
8689
c7122fbe1600
net.http: Fix for Lua 5.2: return error from error handler (xpcall changed)
Matthew Wild <mwild1@gmail.com>
parents:
8555
diff
changeset
|
43 local function handleerr(err) log("error", "Traceback[http]: %s", traceback(tostring(err), 2)); return err; end |
8690
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
44 local function log_if_failed(req, ret, ...) |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
45 if not ret then |
10112
b327f2870382
net.*: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
9611
diff
changeset
|
46 log("error", "Request '%s': error in callback: %s", req.id, (...)); |
8690
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
47 if not req.suppress_errors then |
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
48 error(...); |
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
49 end |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
50 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
51 return ...; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
52 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
53 |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
54 local function destroy_request(request) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
55 local conn = request.conn; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
56 if conn then |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
57 request.conn = nil; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
58 conn:close() |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
59 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
60 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
61 |
11016
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
62 local function cancel_request(request, reason) |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
63 if request.callback then |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
64 request.callback(reason or "cancelled", 0, request); |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
65 request.callback = nil; |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
66 end |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
67 if request.conn then |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
68 destroy_request(request); |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
69 end |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
70 end |
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
71 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
72 local function request_reader(request, data, err) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
73 if not request.parser then |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
74 local function error_cb(reason) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
75 if request.callback then |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
76 request.callback(reason or "connection-closed", 0, request); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
77 request.callback = nil; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
78 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
79 destroy_request(request); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
80 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
81 |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
82 if not data then |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
83 error_cb(err); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
84 return; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
85 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
86 |
11185
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
87 local finalize_sink; |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
88 local function success_cb(r) |
11185
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
89 if r.partial then |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
90 -- Request should be streamed |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
91 log("debug", "Request '%s': partial response (%s%s)", |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
92 request.id, |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
93 r.chunked and "chunked, " or "", |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
94 r.body_length and ("%d bytes"):format(r.body_length) or "unknown length" |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
95 ); |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
96 if request.streaming_handler then |
12881
91baddaeea84
net.http: Add missing log parameter
Matthew Wild <mwild1@gmail.com>
parents:
12273
diff
changeset
|
97 log("debug", "Request '%s': Streaming via handler", request.id); |
11185
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
98 r.body_sink, finalize_sink = request.streaming_handler(r); |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
99 end |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
100 return; |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
101 elseif finalize_sink then |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
102 log("debug", "Request '%s': Finalizing response stream"); |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
103 finalize_sink(r); |
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
104 end |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
105 if request.callback then |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
106 request.callback(r.body, r.code, r, request); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
107 request.callback = nil; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
108 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
109 destroy_request(request); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
110 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
111 local function options_cb() |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
112 return request; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
113 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
114 request.parser = httpstream_new(success_cb, error_cb, "client", options_cb); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
115 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
116 request.parser:feed(data); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
117 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
118 |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
119 -- Connection listener callbacks |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
120 function listener.onconnect(conn) |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
121 local req = requests[conn]; |
8199
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
122 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
123 -- Initialize request object |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
124 req.write = function (...) return req.conn:write(...); end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
125 local callback = req.callback; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
126 req.callback = function (content, code, response, request) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
127 do |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
128 local event = { http = req.http, url = req.url, request = req, response = response, content = content, code = code, callback = req.callback }; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
129 req.http.events.fire_event("response", event); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
130 content, code, response = event.content, event.code, event.response; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
131 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
132 |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
133 log("debug", "Request '%s': Calling callback, status %s", req.id, code or "---"); |
9562
acf74ad0b795
Many things: switch from hacky multi-arg xpcall implementations to a standard util.xpcall
Matthew Wild <mwild1@gmail.com>
parents:
8731
diff
changeset
|
134 return log_if_failed(req.id, xpcall(callback, handleerr, content, code, response, request)); |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
135 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
136 req.reader = request_reader; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
137 req.state = "status"; |
11016
5176d9f727f6
net.http: Add request:cancel() method
Matthew Wild <mwild1@gmail.com>
parents:
11015
diff
changeset
|
138 req.cancel = cancel_request; |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
139 |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
140 requests[req.conn] = req; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
141 |
8199
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
142 -- Validate certificate |
8200
e92585ab4998
net.http: Add option for disabling TLS certifictate validation
Kim Alvefur <zash@zash.se>
parents:
8199
diff
changeset
|
143 if not req.insecure and conn:ssl() then |
8199
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
144 local sock = conn:socket(); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
145 local chain_valid = sock.getpeerverification and sock:getpeerverification(); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
146 if not chain_valid then |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
147 req.callback("certificate-chain-invalid", 0, req); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
148 req.callback = nil; |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
149 conn:close(); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
150 return; |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
151 end |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
152 local cert = sock.getpeercertificate and sock:getpeercertificate(); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
153 if not cert or not verify_identity(req.host, false, cert) then |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
154 req.callback("certificate-verify-failed", 0, req); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
155 req.callback = nil; |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
156 conn:close(); |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
157 return; |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
158 end |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
159 end |
8f82d3cd0631
net.http: Validate HTTPS certificates (fixes #659)
Kim Alvefur <zash@zash.se>
parents:
8197
diff
changeset
|
160 |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
161 -- Send the request |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
162 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
|
163 if req.query then |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
164 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
|
165 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
166 |
11661
735b8f4a6d7e
net.http: Send entire HTTP request header as one write
Kim Alvefur <zash@zash.se>
parents:
11220
diff
changeset
|
167 for k, v in pairs(req.headers) do |
735b8f4a6d7e
net.http: Send entire HTTP request header as one write
Kim Alvefur <zash@zash.se>
parents:
11220
diff
changeset
|
168 t_insert(request_line, k .. ": " .. v .. "\r\n"); |
735b8f4a6d7e
net.http: Send entire HTTP request header as one write
Kim Alvefur <zash@zash.se>
parents:
11220
diff
changeset
|
169 end |
735b8f4a6d7e
net.http: Send entire HTTP request header as one write
Kim Alvefur <zash@zash.se>
parents:
11220
diff
changeset
|
170 t_insert(request_line, "\r\n") |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
171 conn:write(t_concat(request_line)); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
172 |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
173 if req.body then |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
174 conn:write(req.body); |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
175 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
176 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
177 |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
178 function listener.onincoming(conn, data) |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
179 local request = requests[conn]; |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
180 |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
181 if not request then |
10112
b327f2870382
net.*: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
9611
diff
changeset
|
182 log("warn", "Received response from connection %s with no request attached!", conn); |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
183 return; |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
184 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
185 |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
186 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
|
187 request:reader(data); |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
188 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
189 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
190 |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
191 function listener.ondisconnect(conn, err) |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
192 local request = requests[conn]; |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
193 if request and request.conn then |
8045
55a56dc935f2
net.http: Pass error all the way to callback
Kim Alvefur <zash@zash.se>
parents:
7793
diff
changeset
|
194 request:reader(nil, err or "closed"); |
4557
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
195 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
196 requests[conn] = nil; |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
197 end |
2abe4e541d52
net.http, httpclient_listener: Merge listener into net.http
Matthew Wild <mwild1@gmail.com>
parents:
4471
diff
changeset
|
198 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
199 function listener.onattach(conn, req) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
200 requests[conn] = req; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
201 req.conn = conn; |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
202 end |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
203 |
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
|
204 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
|
205 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
|
206 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
|
207 |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
208 function listener.onfail(req, reason) |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
209 req.http.events.fire_event("request-connection-error", { http = req.http, request = req, url = req.url, err = reason }); |
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
210 req.callback(reason or "connection failed", 0, req); |
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
|
211 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
|
212 |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
213 local function request(self, u, ex, callback) |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 local req = url.parse(u); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
215 |
903
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
216 if not (req and req.host) then |
8045
55a56dc935f2
net.http: Pass error all the way to callback
Kim Alvefur <zash@zash.se>
parents:
7793
diff
changeset
|
217 callback("invalid-url", 0, req); |
903
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
218 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
|
219 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
220 |
10994
e2ce067bb59a
net.http: Fix traceback on invalid URL passed to request()
Matthew Wild <mwild1@gmail.com>
parents:
9611
diff
changeset
|
221 req.url = u; |
e2ce067bb59a
net.http: Fix traceback on invalid URL passed to request()
Matthew Wild <mwild1@gmail.com>
parents:
9611
diff
changeset
|
222 req.http = self; |
11220
9b25eecde9e6
net.http: track time of request for debug/stats purposes
Matthew Wild <mwild1@gmail.com>
parents:
11185
diff
changeset
|
223 req.time = os_time(); |
10994
e2ce067bb59a
net.http: Fix traceback on invalid URL passed to request()
Matthew Wild <mwild1@gmail.com>
parents:
9611
diff
changeset
|
224 |
903
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
225 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
|
226 req.path = "/"; |
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
227 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
228 |
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
|
229 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
|
230 |
8114
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
231 do |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
232 local event = { http = self, url = u, request = req, options = ex, callback = callback }; |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
233 local ret = self.events.fire_event("pre-request", event); |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
234 if ret then |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
235 return ret; |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
236 end |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
237 req, u, ex, req.callback = event.request, event.url, event.options, event.callback; |
8114
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
238 end |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
239 |
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
|
240 local method, headers, body; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
241 |
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
|
242 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 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
|
249 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
|
250 |
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
|
251 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
|
252 ["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
|
253 ["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
|
254 }; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
255 |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
256 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
|
257 headers["Authorization"] = "Basic "..b64(req.userinfo); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
258 end |
4351
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
259 |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
260 if ex then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
261 req.onlystatus = ex.onlystatus; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
262 body = ex.body; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
263 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
|
264 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
|
265 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
|
266 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
|
267 end |
4351
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
268 if ex.method then method = ex.method; end |
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
269 if ex.headers then |
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
270 for k, v in pairs(ex.headers) do |
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
271 headers[k] = v; |
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
272 end |
3f414091a008
net.http: Whitespace fixes
Matthew Wild <mwild1@gmail.com>
parents:
4350
diff
changeset
|
273 end |
8200
e92585ab4998
net.http: Add option for disabling TLS certifictate validation
Kim Alvefur <zash@zash.se>
parents:
8199
diff
changeset
|
274 req.insecure = ex.insecure; |
8690
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
275 req.suppress_errors = ex.suppress_errors; |
11185
409ce7686c11
net.http: Add support for streaming chunked/large responses
Matthew Wild <mwild1@gmail.com>
parents:
11068
diff
changeset
|
276 req.streaming_handler = ex.streaming_handler; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
277 end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
278 |
7520
fc6c24cb3599
net.http: Add quotes around ids in log messages
Matthew Wild <mwild1@gmail.com>
parents:
7464
diff
changeset
|
279 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
|
280 |
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
|
281 -- 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
|
282 req.method, req.headers, req.body = method, headers, body; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5714
diff
changeset
|
283 |
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
|
284 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
|
285 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
|
286 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
|
287 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
|
288 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
|
289 |
12273
c0f49a4026f8
net.http: Allow using DANE via options or per request settings
Kim Alvefur <zash@zash.se>
parents:
11749
diff
changeset
|
290 local use_dane = self.options and self.options.use_dane; |
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
|
291 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
|
292 if using_https then |
8197
55826e29c719
net.http: Move default SSL/TLS settings into options, allowing them to be overriden in new()
Kim Alvefur <zash@zash.se>
parents:
8196
diff
changeset
|
293 sslctx = ex and ex.sslctx or self.options and self.options.sslctx; |
12273
c0f49a4026f8
net.http: Allow using DANE via options or per request settings
Kim Alvefur <zash@zash.se>
parents:
11749
diff
changeset
|
294 if ex and ex.use_dane ~= nil then |
c0f49a4026f8
net.http: Allow using DANE via options or per request settings
Kim Alvefur <zash@zash.se>
parents:
11749
diff
changeset
|
295 use_dane = ex.use_dane; |
c0f49a4026f8
net.http: Allow using DANE via options or per request settings
Kim Alvefur <zash@zash.se>
parents:
11749
diff
changeset
|
296 end |
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
|
297 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
|
298 |
12273
c0f49a4026f8
net.http: Allow using DANE via options or per request settings
Kim Alvefur <zash@zash.se>
parents:
11749
diff
changeset
|
299 local http_service = basic_resolver.new(host, port_number, "tcp", { servername = req.host; use_dane = use_dane }); |
8551
2bd2e94a0496
net.http: Refactor to use new net.connect API, brings support for async DNS
Matthew Wild <mwild1@gmail.com>
parents:
8535
diff
changeset
|
300 connect(http_service, listener, { sslctx = sslctx }, req); |
8114
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
301 |
12df41a5a4b1
net.http: Fire new events: pre-request, request-connection-error, request, response
Matthew Wild <mwild1@gmail.com>
parents:
8113
diff
changeset
|
302 self.events.fire_event("request", { http = self, request = req, url = u }); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
303 return req; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
304 end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
305 |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
306 local function new(options) |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
307 local http = { |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
308 options = options; |
10803
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
309 request = function (self, u, ex, callback) |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
310 if callback ~= nil then |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
311 return request(self, u, ex, callback); |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
312 else |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
313 return promise.new(function (resolve, reject) |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
314 request(self, u, ex, function (body, code, a, b) |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
315 if code == 0 then |
11048
160308b4b384
net.http: use new net.http.errors lib for creating error object
Matthew Wild <mwild1@gmail.com>
parents:
11017
diff
changeset
|
316 reject(http_errors.new(body, { request = a })); |
10803
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
317 else |
11049
f103f59ea2b5
net.http: http.request() promise now resolves with response (breaking change)
Matthew Wild <mwild1@gmail.com>
parents:
11048
diff
changeset
|
318 a.request = b; |
f103f59ea2b5
net.http: http.request() promise now resolves with response (breaking change)
Matthew Wild <mwild1@gmail.com>
parents:
11048
diff
changeset
|
319 resolve(a); |
10803
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
320 end |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
321 end); |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
322 end); |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
323 end |
71d04bd6cadd
net.http: Return a Promise if no callback is given
Kim Alvefur <zash@zash.se>
parents:
10464
diff
changeset
|
324 end; |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
325 new = options and function (new_options) |
9611
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
326 local final_options = {}; |
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
327 for k, v in pairs(options) do final_options[k] = v; end |
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
328 if new_options then |
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
329 for k, v in pairs(new_options) do final_options[k] = v; end |
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
330 end |
2700317f93e4
net.http: Manually merge settings (fixes #1231)
Kim Alvefur <zash@zash.se>
parents:
9562
diff
changeset
|
331 return new(final_options); |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
332 end or new; |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
333 events = events.new(); |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
334 }; |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
335 return http; |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
336 end |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
337 |
8197
55826e29c719
net.http: Move default SSL/TLS settings into options, allowing them to be overriden in new()
Kim Alvefur <zash@zash.se>
parents:
8196
diff
changeset
|
338 local default_http = new({ |
11749
83d6d6a70edf
net.http: fail open if surrounding code does not configure TLS
Jonas Schäfer <jonas@wielicki.name>
parents:
11661
diff
changeset
|
339 sslctx = { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" }, alpn = "http/1.1", verify = "peer" }; |
8690
0f6623712239
net.http: Allow enabling/disabling error suppression, useful for tests
Matthew Wild <mwild1@gmail.com>
parents:
8689
diff
changeset
|
340 suppress_errors = true; |
8197
55826e29c719
net.http: Move default SSL/TLS settings into options, allowing them to be overriden in new()
Kim Alvefur <zash@zash.se>
parents:
8196
diff
changeset
|
341 }); |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
342 |
6780
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
343 return { |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
344 request = function (u, ex, callback) |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
345 return default_http:request(u, ex, callback); |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
346 end; |
8196 | 347 default = default_http; |
8113
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
348 new = new; |
cfb5ab763384
net.http: Allow creation of http client objects, with custom options
Matthew Wild <mwild1@gmail.com>
parents:
8045
diff
changeset
|
349 events = default_http.events; |
6780
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
350 -- COMPAT |
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
351 urlencode = util_http.urlencode; |
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
352 urldecode = util_http.urldecode; |
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
353 formencode = util_http.formencode; |
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
354 formdecode = util_http.formdecode; |
11015
355eae2f9ba8
net.http: Re-expose destroy_request() function
Matthew Wild <mwild1@gmail.com>
parents:
10994
diff
changeset
|
355 destroy_request = destroy_request; |
11067
f2ffc16a9669
net.http: Add feature discovery (currently just contains SNI)
Matthew Wild <mwild1@gmail.com>
parents:
11063
diff
changeset
|
356 features = { |
f2ffc16a9669
net.http: Add feature discovery (currently just contains SNI)
Matthew Wild <mwild1@gmail.com>
parents:
11063
diff
changeset
|
357 sni = true; |
f2ffc16a9669
net.http: Add feature discovery (currently just contains SNI)
Matthew Wild <mwild1@gmail.com>
parents:
11063
diff
changeset
|
358 }; |
6780
647adfd8f738
net.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6501
diff
changeset
|
359 }; |