Comparison

net/http.lua @ 4797:e239668aa6d2

Merge 0.9->trunk
author Matthew Wild <mwild1@gmail.com>
date Sun, 29 Apr 2012 02:10:55 +0100
parent 4557:2abe4e541d52
child 4865:9171dc2357e0
comparison
equal deleted inserted replaced
4796:04a34287dc12 4797:e239668aa6d2
11 local url = require "socket.url" 11 local url = require "socket.url"
12 local httpstream_new = require "util.httpstream".new; 12 local httpstream_new = require "util.httpstream".new;
13 13
14 local server = require "net.server" 14 local server = require "net.server"
15 15
16 local connlisteners_get = require "net.connlisteners".get;
17 local listener = connlisteners_get("httpclient") or error("No httpclient listener!");
18
19 local t_insert, t_concat = table.insert, table.concat; 16 local t_insert, t_concat = table.insert, table.concat;
20 local pairs, ipairs = pairs, ipairs; 17 local pairs, ipairs = pairs, ipairs;
21 local tonumber, tostring, xpcall, select, debug_traceback, char, format = 18 local tonumber, tostring, xpcall, select, debug_traceback, char, format =
22 tonumber, tostring, xpcall, select, debug.traceback, string.char, string.format; 19 tonumber, tostring, xpcall, select, debug.traceback, string.char, string.format;
23 20
24 local log = require "util.logger".init("http"); 21 local log = require "util.logger".init("http");
25 22
26 module "http" 23 module "http"
24
25 local requests = {}; -- Open requests
26
27 local listener = { default_port = 80, default_mode = "*a" };
28
29 function listener.onconnect(conn)
30 local req = requests[conn];
31 -- Send the request
32 local request_line = { req.method or "GET", " ", req.path, " HTTP/1.1\r\n" };
33 if req.query then
34 t_insert(request_line, 4, "?"..req.query);
35 end
36
37 conn:write(t_concat(request_line));
38 local t = { [2] = ": ", [4] = "\r\n" };
39 for k, v in pairs(req.headers) do
40 t[1], t[3] = k, v;
41 conn:write(t_concat(t));
42 end
43 conn:write("\r\n");
44
45 if req.body then
46 conn:write(req.body);
47 end
48 end
49
50 function listener.onincoming(conn, data)
51 local request = requests[conn];
52
53 if not request then
54 log("warn", "Received response from connection %s with no request attached!", tostring(conn));
55 return;
56 end
57
58 if data and request.reader then
59 request:reader(data);
60 end
61 end
62
63 function listener.ondisconnect(conn, err)
64 local request = requests[conn];
65 if request and request.conn then
66 request:reader(nil);
67 end
68 requests[conn] = nil;
69 end
27 70
28 function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); end 71 function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); end
29 function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); end 72 function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); end
30 73
31 local function _formencodepart(s) 74 local function _formencodepart(s)
150 193
151 req.callback = function (content, code, request, response) log("debug", "Calling callback, status %s", code or "---"); return select(2, xpcall(function () return callback(content, code, request, response) end, handleerr)); end 194 req.callback = function (content, code, request, response) log("debug", "Calling callback, status %s", code or "---"); return select(2, xpcall(function () return callback(content, code, request, response) end, handleerr)); end
152 req.reader = request_reader; 195 req.reader = request_reader;
153 req.state = "status"; 196 req.state = "status";
154 197
155 listener.register_request(req.handler, req); 198 requests[req.handler] = req;
156
157 return req; 199 return req;
158 end 200 end
159 201
160 function destroy_request(request) 202 function destroy_request(request)
161 if request.conn then 203 if request.conn then