Software /
code /
prosody
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 |