Sat, 22 May 2010 01:48:31 +0200
util.sasl.scram: Check nonce in client final message. Check channel binding flag in client first message. Adding some TODOs on more strict parsing. (thanks Marc Santamaria)
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 |
1522
569d58d21612
Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents:
1331
diff
changeset
|
4 | -- |
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 | |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | local socket = require "socket" |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | local mime = require "mime" |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | local url = require "socket.url" |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | local server = require "net.server" |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | local connlisteners_get = require "net.connlisteners".get; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | local listener = connlisteners_get("httpclient") or error("No httpclient listener!"); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | local t_insert, t_concat = table.insert, table.concat; |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
20 | local tonumber, tostring, pairs, xpcall, select, debug_traceback, char, format = |
1331
4443309b5528
net.http: (Re-)add url[en|de]code functions
Matthew Wild <mwild1@gmail.com>
parents:
1112
diff
changeset
|
21 | tonumber, tostring, pairs, xpcall, select, debug.traceback, string.char, string.format; |
678
1859edec2237
Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents:
677
diff
changeset
|
22 | |
1859edec2237
Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents:
677
diff
changeset
|
23 | local log = require "util.logger".init("http"); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | |
1331
4443309b5528
net.http: (Re-)add url[en|de]code functions
Matthew Wild <mwild1@gmail.com>
parents:
1112
diff
changeset
|
25 | module "http" |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | |
1331
4443309b5528
net.http: (Re-)add url[en|de]code functions
Matthew Wild <mwild1@gmail.com>
parents:
1112
diff
changeset
|
27 | function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); end |
4443309b5528
net.http: (Re-)add url[en|de]code functions
Matthew Wild <mwild1@gmail.com>
parents:
1112
diff
changeset
|
28 | function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | local function expectbody(reqt, code) |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | if reqt.method == "HEAD" then return nil end |
2777
a0ea72846b46
net.http: Don't expect the body on redirects
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
32 | if code == 204 or code == 304 or code == 301 then return nil end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | if code >= 100 and code < 200 then return nil end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | return 1 |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | local function request_reader(request, data, startpos) |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | if not data then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | if request.body then |
677
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
40 | log("debug", "Connection closed, but we have data, calling callback..."); |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
41 | request.callback(t_concat(request.body), request.code, request); |
677
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
42 | elseif request.state ~= "completed" then |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | -- Error.. connection was closed prematurely |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
44 | request.callback("connection-closed", 0, request); |
2808
23bb7e29819e
net.http: Don't re-destroy a request when the connection is closed
Matthew Wild <mwild1@gmail.com>
parents:
2807
diff
changeset
|
45 | return; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | destroy_request(request); |
714
ab3c47f4fe1d
net.http: Fix for callbacks being triggered multiple times for the same request
Matthew Wild <mwild1@gmail.com>
parents:
678
diff
changeset
|
48 | request.body = nil; |
ab3c47f4fe1d
net.http: Fix for callbacks being triggered multiple times for the same request
Matthew Wild <mwild1@gmail.com>
parents:
678
diff
changeset
|
49 | request.state = "completed"; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | return; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | end |
714
ab3c47f4fe1d
net.http: Fix for callbacks being triggered multiple times for the same request
Matthew Wild <mwild1@gmail.com>
parents:
678
diff
changeset
|
52 | if request.state == "body" and request.state ~= "completed" then |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
53 | log("debug", "Reading body...") |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 | if not request.body then request.body = {}; request.havebodylength, request.bodylength = 0, tonumber(request.responseheaders["content-length"]); end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | if startpos then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 | data = data:sub(startpos, -1) |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 | t_insert(request.body, data); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | if request.bodylength then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | request.havebodylength = request.havebodylength + #data; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 | if request.havebodylength >= request.bodylength then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | -- We have the body |
677
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
63 | log("debug", "Have full body, calling callback"); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 | if request.callback then |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
65 | request.callback(t_concat(request.body), request.code, request); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 | end |
677
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
67 | request.body = nil; |
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
68 | request.state = "completed"; |
93e5309c5430
Fix to prevent calling HTTP request callback twice with the same data
Matthew Wild <mwild1@gmail.com>
parents:
646
diff
changeset
|
69 | else |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
70 | log("debug", "Have "..request.havebodylength.." bytes out of "..request.bodylength); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | elseif request.state == "headers" then |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
74 | log("debug", "Reading headers...") |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 | local pos = startpos; |
2807
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
76 | local headers, headers_complete = request.responseheaders; |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
77 | if not headers then |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
78 | headers = {}; |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
79 | request.responseheaders = headers; |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
80 | end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | for line in data:sub(startpos, -1):gmatch("(.-)\r\n") do |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 | startpos = startpos + #line + 2; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | local k, v = line:match("(%S+): (.+)"); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | if k and v then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | headers[k:lower()] = v; |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
86 | --log("debug", "Header: "..k:lower().." = "..v); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | elseif #line == 0 then |
2807
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
88 | headers_complete = true; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 | break; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 | else |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
91 | log("warn", "Unhandled header line: "..line); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 | end |
2807
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
94 | if not headers_complete then return; end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 | -- Reached the end of the headers |
2807
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
96 | if not expectbody(request, request.code) then |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
97 | request.callback(nil, request.code, request); |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
98 | return; |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
99 | end |
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
100 | request.state = "body"; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 | if #data > startpos then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 | return request_reader(request, data, startpos); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 | elseif request.state == "status" then |
2675
ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
Matthew Wild <mwild1@gmail.com>
parents:
2673
diff
changeset
|
105 | log("debug", "Reading status...") |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | local http, code, text, linelen = data:match("^HTTP/(%S+) (%d+) (.-)\r\n()", startpos); |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
107 | code = tonumber(code); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 | if not code then |
2809
1a7b5b775275
net.http: Close connection when invalid status line is received from the server
Matthew Wild <mwild1@gmail.com>
parents:
2808
diff
changeset
|
109 | log("warn", "Invalid HTTP status line, telling callback then closing"); |
1a7b5b775275
net.http: Close connection when invalid status line is received from the server
Matthew Wild <mwild1@gmail.com>
parents:
2808
diff
changeset
|
110 | local ret = request.callback("invalid-status-line", 0, request); |
1a7b5b775275
net.http: Close connection when invalid status line is received from the server
Matthew Wild <mwild1@gmail.com>
parents:
2808
diff
changeset
|
111 | destroy_request(request); |
1a7b5b775275
net.http: Close connection when invalid status line is received from the server
Matthew Wild <mwild1@gmail.com>
parents:
2808
diff
changeset
|
112 | return ret; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 | |
633
fe1e01a06729
Fix nil status code for http request callbacks
Matthew Wild <mwild1@gmail.com>
parents:
627
diff
changeset
|
115 | request.code, request.responseversion = code, http; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 | |
2807
8e2dba8904a7
net.http: Port commit 2f235c57d713 to net.http to fix headers in responses (thanks dersd)
Matthew Wild <mwild1@gmail.com>
parents:
2777
diff
changeset
|
117 | if request.onlystatus then |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | if request.callback then |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
119 | request.callback(nil, code, request); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 | destroy_request(request); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 | return; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 | request.state = "headers"; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | if #data > linelen then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | return request_reader(request, data, linelen); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 | |
678
1859edec2237
Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents:
677
diff
changeset
|
133 | local function handleerr(err) log("error", "Traceback[http]: %s: %s", tostring(err), debug_traceback()); end |
646
90da4c9b34b5
HTTP requests now have status code as a number instead of a string. Switched parameters on both http.request() and the callback to better match LuaSocket's http module
Matthew Wild <mwild1@gmail.com>
parents:
633
diff
changeset
|
134 | function request(u, ex, callback) |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | local req = url.parse(u); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | |
903
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
137 | 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
|
138 | 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
|
139 | 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
|
140 | end |
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
141 | |
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
142 | 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
|
143 | req.path = "/"; |
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
144 | end |
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
145 | |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 | local custom_headers, body; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 | local default_headers = { ["Host"] = req.host, ["User-Agent"] = "Prosody XMPP Server" } |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 | if req.userinfo then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 | default_headers["Authorization"] = "Basic "..mime.b64(req.userinfo); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 | if ex then |
738
cf70342985df
net.http: custom_headers -> headers
Matthew Wild <mwild1@gmail.com>
parents:
720
diff
changeset
|
155 | custom_headers = ex.headers; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 | req.onlystatus = ex.onlystatus; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 | body = ex.body; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 | if body then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 | req.method = "POST "; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 | default_headers["Content-Length"] = tostring(#body); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 | default_headers["Content-Type"] = "application/x-www-form-urlencoded"; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 | if ex.method then req.method = ex.method; end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 | |
739
1def06cd9311
Port to new server.lua, quite some changes, but I believe everything to be working
Matthew Wild <mwild1@gmail.com>
parents:
738
diff
changeset
|
166 | req.handler, req.conn = server.wrapclient(socket.tcp(), req.host, req.port or 80, listener, "*a"); |
2127
828e161cdfc7
net.httpserver, net.http: Update for new net.server API (untested)
Matthew Wild <mwild1@gmail.com>
parents:
1522
diff
changeset
|
167 | req.write = function (...) return req.handler:write(...); end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 | req.conn:settimeout(0); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 | local ok, err = req.conn:connect(req.host, req.port or 80); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 | if not ok and err ~= "timeout" then |
903
6737d005a84a
net.http: Don't throw error on invalid URLs. Fixes #56.
Matthew Wild <mwild1@gmail.com>
parents:
739
diff
changeset
|
171 | callback(nil, 0, req); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 | return nil, err; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 | |
719
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
175 | local request_line = { req.method or "GET", " ", req.path, " HTTP/1.1\r\n" }; |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
176 | |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
177 | if req.query then |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
178 | t_insert(request_line, 4, "?"); |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
179 | t_insert(request_line, 5, req.query); |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
180 | end |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
181 | |
b1eb112478b8
net.http: Fix to send query part of URL to server
Matthew Wild <mwild1@gmail.com>
parents:
714
diff
changeset
|
182 | req.write(t_concat(request_line)); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 | local t = { [2] = ": ", [4] = "\r\n" }; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 | if custom_headers then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 | for k, v in pairs(custom_headers) do |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 | t[1], t[3] = k, v; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 | req.write(t_concat(t)); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 | default_headers[k] = nil; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 | for k, v in pairs(default_headers) do |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 | t[1], t[3] = k, v; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 | req.write(t_concat(t)); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 | default_headers[k] = nil; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 | req.write("\r\n"); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 | if body then |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 | req.write(body); |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 | |
720
8f22e9fb2291
net.http: Don't log content from server
Matthew Wild <mwild1@gmail.com>
parents:
719
diff
changeset
|
203 | req.callback = function (content, code, request) log("debug", "Calling callback, status %s", code or "---"); return select(2, xpcall(function () return callback(content, code, request) end, handleerr)); end |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 | req.reader = request_reader; |
678
1859edec2237
Protected call for HTTP request callbacks, to catch errors
Matthew Wild <mwild1@gmail.com>
parents:
677
diff
changeset
|
205 | req.state = "status"; |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 | listener.register_request(req.handler, req); |
619
6d720aba51cb
Oops, don't call server.loop() because we'll be running inside the server
Matthew Wild <mwild1@gmail.com>
parents:
618
diff
changeset
|
208 | |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 | return req; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 | function destroy_request(request) |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 | if request.conn then |
2673
61ae351c19b5
net.http: destroy_request(): Remove update for new server API, pass request.handler instead of request.conn to ondisconnect
Matthew Wild <mwild1@gmail.com>
parents:
2672
diff
changeset
|
214 | request.conn = nil; |
61ae351c19b5
net.http: destroy_request(): Remove update for new server API, pass request.handler instead of request.conn to ondisconnect
Matthew Wild <mwild1@gmail.com>
parents:
2672
diff
changeset
|
215 | request.handler:close() |
61ae351c19b5
net.http: destroy_request(): Remove update for new server API, pass request.handler instead of request.conn to ondisconnect
Matthew Wild <mwild1@gmail.com>
parents:
2672
diff
changeset
|
216 | listener.ondisconnect(request.handler, "closed"); |
616
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 | end |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 | _M.urlencode = urlencode; |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 | |
69bc5782b25e
Non-blocking HTTP requests (adding net.http)
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 | return _M; |