aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/stanza_router.lua8
-rw-r--r--net/http.lua2
-rw-r--r--net/http/parser.lua12
3 files changed, 12 insertions, 10 deletions
diff --git a/core/stanza_router.lua b/core/stanza_router.lua
index 4c241c27..50044766 100644
--- a/core/stanza_router.lua
+++ b/core/stanza_router.lua
@@ -28,13 +28,13 @@ local function handle_unhandled_stanza(host, origin, stanza)
return true;
end
end
- if stanza.attr.xmlns == nil then
+ if stanza.attr.xmlns == nil and origin.send then
log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin.type, stanza.name, xmlns); -- we didn't handle it
if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then
origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
end
elseif not((name == "features" or name == "error") and xmlns == "http://etherx.jabber.org/streams") then -- FIXME remove check once we handle S2S features
- log("warn", "Unhandled %s stream element: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
+ log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
origin:close("unsupported-stanza-type");
end
end
@@ -111,8 +111,8 @@ function core_process_stanza(origin, stanza)
log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host);
origin:close("not-authorized");
return;
- elseif not hosts[to_host] then
- log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, to_host);
+ elseif not hosts[host] then
+ log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, host);
origin:close("host-unknown");
return;
end
diff --git a/net/http.lua b/net/http.lua
index 59f2c080..f2061e00 100644
--- a/net/http.lua
+++ b/net/http.lua
@@ -68,7 +68,7 @@ function listener.ondisconnect(conn, err)
requests[conn] = nil;
end
-function urlencode(s) return s and (s:gsub("%W", function (c) return format("%%%02x", c:byte()); end)); 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)
diff --git a/net/http/parser.lua b/net/http/parser.lua
index 3d9d1a87..d3f0dc03 100644
--- a/net/http/parser.lua
+++ b/net/http/parser.lua
@@ -1,8 +1,11 @@
local tonumber = tonumber;
local assert = assert;
+local url_parse = require "socket.url".parse;
+local urldecode = require "net.http".urldecode;
local function preprocess_path(path)
+ path = urldecode(path);
if path:sub(1,1) ~= "/" then
path = "/"..path;
end
@@ -88,15 +91,14 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb)
responseheaders = headers;
};
else
- -- path normalization
- if path:match("^https?://") then
- headers.host, path = path:match("^https?://([^/]*)(.*)");
- end
- path = preprocess_path(path);
+ local parsed_url = url_parse(path);
+ path = preprocess_path(parsed_url.path);
+ headers.host = parsed_url.host;
len = len or 0;
packet = {
method = method;
+ url = parsed_url;
path = path;
httpversion = httpversion;
headers = headers;