--
local socket = require "socket"
-local mime = require "mime"
+local b64 = require "util.encodings".base64.encode;
local url = require "socket.url"
local httpstream_new = require "util.httpstream".new;
+local util_http = require "util.http";
+
+local ssl_available = pcall(require, "ssl");
local server = require "net.server"
requests[conn] = nil;
end
-function urlencode(s) return s and (s:gsub("[^a-zA-Z0-9.~_-]", function (c) return format("%%%02x", c:byte()); end)); end
-function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return char(tonumber(c,16)); end)); end
-
-local function _formencodepart(s)
- return s and (s:gsub("%W", function (c)
- if c ~= " " then
- return format("%%%02x", c:byte());
- else
- return "+";
- end
- end));
-end
-
-function formencode(form)
- local result = {};
- if form[1] then -- Array of ordered { name, value }
- for _, field in ipairs(form) do
- t_insert(result, _formencodepart(field.name).."=".._formencodepart(field.value));
- end
- else -- Unordered map of name -> value
- for name, value in pairs(form) do
- t_insert(result, _formencodepart(name).."=".._formencodepart(value));
- end
- end
- return t_concat(result, "&");
-end
-
-function formdecode(s)
- if not s:match("=") then return urldecode(s); end
- local r = {};
- for k, v in s:gmatch("([^=&]*)=([^&]*)") do
- k, v = k:gsub("%+", "%%20"), v:gsub("%+", "%%20");
- k, v = urldecode(k), urldecode(v);
- t_insert(r, { name = k, value = v });
- r[k] = v;
- end
- return r;
-end
-
-local function request_reader(request, data, startpos)
+local function request_reader(request, data)
if not request.parser then
if not data then return; end
local function success_cb(r)
};
if req.userinfo then
- headers["Authorization"] = "Basic "..mime.b64(req.userinfo);
+ headers["Authorization"] = "Basic "..b64(req.userinfo);
end
if ex then
req.method, req.headers, req.body = method, headers, body;
local using_https = req.scheme == "https";
+ if using_https and not ssl_available then
+ error("SSL not available, unable to contact https URL");
+ end
local port = tonumber(req.port) or (using_https and 443 or 80);
-- Connect the socket, and wrap it with net.server
return nil, err;
end
- req.handler, req.conn = server.wrapclient(conn, req.host, port, listener, "*a", using_https and { mode = "client", protocol = "sslv23" });
+ local sslctx = false;
+ if using_https then
+ sslctx = ex and ex.sslctx or { mode = "client", protocol = "sslv23", options = { "no_sslv2" } };
+ end
+
+ req.handler, req.conn = server.wrapclient(conn, req.host, port, listener, "*a", sslctx);
req.write = function (...) return req.handler:write(...); end
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
if request.conn then
request.conn = nil;
request.handler:close()
- listener.ondisconnect(request.handler, "closed");
end
end
-_M.urlencode = urlencode;
+local urlencode, urldecode = util_http.urlencode, util_http.urldecode;
+local formencode, formdecode = util_http.formencode, util_http.formdecode;
+
+_M.urlencode, _M.urldecode = urlencode, urldecode;
+_M.formencode, _M.formdecode = formencode, formdecode;
return _M;