diff options
Diffstat (limited to 'plugins/mod_http.lua')
-rw-r--r-- | plugins/mod_http.lua | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/plugins/mod_http.lua b/plugins/mod_http.lua index a15e8cda..28d5d2d4 100644 --- a/plugins/mod_http.lua +++ b/plugins/mod_http.lua @@ -50,6 +50,9 @@ end local function redir_handler(event) event.response.headers.location = event.request.path.."/"; + if event.request.url.query then + event.response.headers.location = event.response.headers.location .. "?" .. event.request.url.query + end return 301; end @@ -64,10 +67,10 @@ function moduleapi.http_url(module, app_name, default_path) end local services = portmanager.get_active_services(); local http_services = services:get("https") or services:get("http") or {}; - for interface, ports in pairs(http_services) do - for port, services in pairs(ports) do + for interface, ports in pairs(http_services) do -- luacheck: ignore 213/interface + for port, service in pairs(ports) do -- luacheck: ignore 512 local url = { - scheme = (external_url.scheme or services[1].service.name); + scheme = (external_url.scheme or service[1].service.name); host = (external_url.host or module:get_option_string("http_host", module.host)); port = tonumber(external_url.port) or port or 80; path = normalize_path(external_url.path or "/").. @@ -105,9 +108,9 @@ function module.add_host(module) elseif event_name:sub(-2, -1) == "/*" then local base_path_len = #event_name:match("/.+$"); local _handler = handler; - handler = function (event) - local path = event.request.path:sub(base_path_len); - return _handler(event, path); + handler = function (_event) + local path = _event.request.path:sub(base_path_len); + return _handler(_event, path); end; module:hook_object_event(server, event_name:sub(1, -3), redir_handler, -1); elseif event_name:sub(-1, -1) == "/" then @@ -120,7 +123,7 @@ function module.add_host(module) module:log("warn", "App %s added handler twice for '%s', ignoring", app_name, event_name); end else - module:log("error", "Invalid route in %s, %q. See http://prosody.im/doc/developers/http#routes", app_name, key); + module:log("error", "Invalid route in %s, %q. See https://prosody.im/doc/developers/http#routes", app_name, key); end end local services = portmanager.get_active_services(); @@ -134,8 +137,8 @@ function module.add_host(module) local function http_app_removed(event) local app_handlers = apps[event.item.name]; apps[event.item.name] = nil; - for event, handler in pairs(app_handlers) do - module:unhook_object_event(server, event, handler); + for event_name, handler in pairs(app_handlers) do + module:unhook_object_event(server, event_name, handler); end end @@ -147,6 +150,31 @@ function module.add_host(module) end end +local trusted_proxies = module:get_option_set("trusted_proxies", { "127.0.0.1", "::1" })._items; + +local function get_ip_from_request(request) + local ip = request.conn:ip(); + local forwarded_for = request.headers.x_forwarded_for; + if forwarded_for then + forwarded_for = forwarded_for..", "..ip; + for forwarded_ip in forwarded_for:gmatch("[^%s,]+") do + if not trusted_proxies[forwarded_ip] then + ip = forwarded_ip; + end + end + end + return ip; +end + +module:wrap_object_event(server._events, false, function (handlers, event_name, event_data) + local request = event_data.request; + if request then + -- Not included in eg http-error events + request.ip = get_ip_from_request(request); + end + return handlers(event_name, event_data); +end); + module:provides("net", { name = "http"; listener = server.listener; |