net/http.lua

Sat, 22 May 2010 01:48:31 +0200

author
Tobias Markmann <tm@ayena.de>
date
Sat, 22 May 2010 01:48:31 +0200
changeset 3099
2c4d06e7e3d3
parent 2925
692b3c6c5bd2
child 3470
0e59b5cdd57b
permissions
-rw-r--r--

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;

mercurial