Mercurial > prosody-hg
comparison net/http.lua @ 2675:ab643a77da2d
net.http: Update print()s to log()s - don't ask how this came to be, I have no idea :)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 19 Feb 2010 03:27:18 +0000 |
| parents | 61ae351c19b5 |
| children | 692b3c6c5bd2 |
comparison
equal
deleted
inserted
replaced
| 2674:a1fdfd7318df | 2675:ab643a77da2d |
|---|---|
| 15 | 15 |
| 16 local connlisteners_get = require "net.connlisteners".get; | 16 local connlisteners_get = require "net.connlisteners".get; |
| 17 local listener = connlisteners_get("httpclient") or error("No httpclient listener!"); | 17 local listener = connlisteners_get("httpclient") or error("No httpclient listener!"); |
| 18 | 18 |
| 19 local t_insert, t_concat = table.insert, table.concat; | 19 local t_insert, t_concat = table.insert, table.concat; |
| 20 local tonumber, tostring, pairs, xpcall, select, debug_traceback, char, format = | 20 local tonumber, tostring, pairs, xpcall, select, debug_traceback, char, format = |
| 21 tonumber, tostring, pairs, xpcall, select, debug.traceback, string.char, string.format; | 21 tonumber, tostring, pairs, xpcall, select, debug.traceback, string.char, string.format; |
| 22 | 22 |
| 23 local log = require "util.logger".init("http"); | 23 local log = require "util.logger".init("http"); |
| 24 local print = function () end | |
| 25 | 24 |
| 26 module "http" | 25 module "http" |
| 27 | 26 |
| 28 function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); end | 27 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 | 28 function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); end |
| 49 request.body = nil; | 48 request.body = nil; |
| 50 request.state = "completed"; | 49 request.state = "completed"; |
| 51 return; | 50 return; |
| 52 end | 51 end |
| 53 if request.state == "body" and request.state ~= "completed" then | 52 if request.state == "body" and request.state ~= "completed" then |
| 54 print("Reading body...") | 53 log("debug", "Reading body...") |
| 55 if not request.body then request.body = {}; request.havebodylength, request.bodylength = 0, tonumber(request.responseheaders["content-length"]); end | 54 if not request.body then request.body = {}; request.havebodylength, request.bodylength = 0, tonumber(request.responseheaders["content-length"]); end |
| 56 if startpos then | 55 if startpos then |
| 57 data = data:sub(startpos, -1) | 56 data = data:sub(startpos, -1) |
| 58 end | 57 end |
| 59 t_insert(request.body, data); | 58 t_insert(request.body, data); |
| 66 request.callback(t_concat(request.body), request.code, request); | 65 request.callback(t_concat(request.body), request.code, request); |
| 67 end | 66 end |
| 68 request.body = nil; | 67 request.body = nil; |
| 69 request.state = "completed"; | 68 request.state = "completed"; |
| 70 else | 69 else |
| 71 print("", "Have "..request.havebodylength.." bytes out of "..request.bodylength); | 70 log("debug", "Have "..request.havebodylength.." bytes out of "..request.bodylength); |
| 72 end | 71 end |
| 73 end | 72 end |
| 74 elseif request.state == "headers" then | 73 elseif request.state == "headers" then |
| 75 print("Reading headers...") | 74 log("debug", "Reading headers...") |
| 76 local pos = startpos; | 75 local pos = startpos; |
| 77 local headers, headers_complete = request.responseheaders; | 76 local headers, headers_complete = request.responseheaders; |
| 78 if not headers then | 77 if not headers then |
| 79 headers = {}; | 78 headers = {}; |
| 80 request.responseheaders = headers; | 79 request.responseheaders = headers; |
| 82 for line in data:sub(startpos, -1):gmatch("(.-)\r\n") do | 81 for line in data:sub(startpos, -1):gmatch("(.-)\r\n") do |
| 83 startpos = startpos + #line + 2; | 82 startpos = startpos + #line + 2; |
| 84 local k, v = line:match("(%S+): (.+)"); | 83 local k, v = line:match("(%S+): (.+)"); |
| 85 if k and v then | 84 if k and v then |
| 86 headers[k:lower()] = v; | 85 headers[k:lower()] = v; |
| 87 --print("Header: "..k:lower().." = "..v); | 86 --log("debug", "Header: "..k:lower().." = "..v); |
| 88 elseif #line == 0 then | 87 elseif #line == 0 then |
| 89 headers_complete = true; | 88 headers_complete = true; |
| 90 break; | 89 break; |
| 91 else | 90 else |
| 92 print("Unhandled header line: "..line); | 91 log("warn", "Unhandled header line: "..line); |
| 93 end | 92 end |
| 94 end | 93 end |
| 95 if not headers_complete then return; end | 94 if not headers_complete then return; end |
| 96 -- Reached the end of the headers | 95 -- Reached the end of the headers |
| 97 if not expectbody(request, request.code) then | 96 if not expectbody(request, request.code) then |
| 101 request.state = "body"; | 100 request.state = "body"; |
| 102 if #data > startpos then | 101 if #data > startpos then |
| 103 return request_reader(request, data, startpos); | 102 return request_reader(request, data, startpos); |
| 104 end | 103 end |
| 105 elseif request.state == "status" then | 104 elseif request.state == "status" then |
| 106 print("Reading status...") | 105 log("debug", "Reading status...") |
| 107 local http, code, text, linelen = data:match("^HTTP/(%S+) (%d+) (.-)\r\n()", startpos); | 106 local http, code, text, linelen = data:match("^HTTP/(%S+) (%d+) (.-)\r\n()", startpos); |
| 108 code = tonumber(code); | 107 code = tonumber(code); |
| 109 if not code then | 108 if not code then |
| 110 log("warn", "Invalid HTTP status line, telling callback then closing"); | 109 log("warn", "Invalid HTTP status line, telling callback then closing"); |
| 111 local ret = request.callback("invalid-status-line", 0, request); | 110 local ret = request.callback("invalid-status-line", 0, request); |
