Software / code / prosody
Comparison
plugins/mod_http.lua @ 8594:b4a0bc46c82d
mod_http: Set request.ip on all HTTP requests (moves code out of mod_bosh) (fixes #540)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 15 Mar 2018 17:22:49 +0100 |
| parent | 7868:11fcdef5022f |
| child | 8596:71da54c7f797 |
comparison
equal
deleted
inserted
replaced
| 8593:c4222e36333c | 8594:b4a0bc46c82d |
|---|---|
| 148 function module.unload() | 148 function module.unload() |
| 149 server.remove_host(host); | 149 server.remove_host(host); |
| 150 end | 150 end |
| 151 end | 151 end |
| 152 | 152 |
| 153 local trusted_proxies = module:get_option_set("trusted_proxies", { "127.0.0.1", "::1" })._items; | |
| 154 | |
| 155 local function get_ip_from_request(request) | |
| 156 local ip = request.conn:ip(); | |
| 157 local forwarded_for = request.headers.x_forwarded_for; | |
| 158 if forwarded_for then | |
| 159 forwarded_for = forwarded_for..", "..ip; | |
| 160 for forwarded_ip in forwarded_for:gmatch("[^%s,]+") do | |
| 161 if not trusted_proxies[forwarded_ip] then | |
| 162 ip = forwarded_ip; | |
| 163 end | |
| 164 end | |
| 165 end | |
| 166 return ip; | |
| 167 end | |
| 168 | |
| 169 module:wrap_object_event(server, false, function (handlers, event_name, event_data) | |
| 170 local request = event_data.request; | |
| 171 if request then | |
| 172 -- Not included in eg http-error events | |
| 173 request.ip = get_ip_from_request(request); | |
| 174 end | |
| 175 return handlers(event_name, event_data); | |
| 176 end); | |
| 177 | |
| 153 module:provides("net", { | 178 module:provides("net", { |
| 154 name = "http"; | 179 name = "http"; |
| 155 listener = server.listener; | 180 listener = server.listener; |
| 156 default_port = 5280; | 181 default_port = 5280; |
| 157 multiplex = { | 182 multiplex = { |