Software /
code /
prosody
Comparison
plugins/mod_proxy65.lua @ 2306:21f0d80f244a
mod_proxy65: Throttle connections to prevent senders flooding the server's buffers if the receiver doesn't receive fast enough
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 03 Dec 2009 14:15:30 +0000 |
parent | 2305:7ddd00260808 |
child | 2308:600ac8992a4c |
comparison
equal
deleted
inserted
replaced
2305:7ddd00260808 | 2306:21f0d80f244a |
---|---|
78 module:log("debug", "target connected ... "); | 78 module:log("debug", "target connected ... "); |
79 elseif transfers[sha].target ~= nil then | 79 elseif transfers[sha].target ~= nil then |
80 transfers[sha].initiator = conn; | 80 transfers[sha].initiator = conn; |
81 session.sha = sha; | 81 session.sha = sha; |
82 module:log("debug", "initiator connected ... "); | 82 module:log("debug", "initiator connected ... "); |
83 throttle_sending(conn, transfers[sha].target); | |
83 end | 84 end |
84 conn:write(string.char(5, 0, 0, 3, sha:len()) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte) | 85 conn:write(string.char(5, 0, 0, 3, sha:len()) .. sha .. string.char(0, 0)); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte) |
85 else | 86 else |
86 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.") | 87 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.") |
87 conn.close(); | 88 conn.close(); |
251 module:log("error", "Possibly two proxy65 components are configured to share the same port."); | 252 module:log("error", "Possibly two proxy65 components are configured to share the same port."); |
252 end | 253 end |
253 | 254 |
254 connlisteners.start(module.host .. ':proxy65'); | 255 connlisteners.start(module.host .. ':proxy65'); |
255 component = componentmanager.register_component(host, handle_to_domain); | 256 component = componentmanager.register_component(host, handle_to_domain); |
257 local sender_lock_threshold = 1024; | |
258 function throttle_sending(sender, receiver) | |
259 sender:pattern(sender_lock_threshold); | |
260 local sender_locked; | |
261 local _sendbuffer = receiver.sendbuffer; | |
262 function receiver.sendbuffer() | |
263 _sendbuffer(); | |
264 if sender_locked and receiver.bufferlen() < sender_lock_threshold then | |
265 sender:lock(false); -- Unlock now | |
266 sender_locked = nil; | |
267 end | |
268 end | |
269 | |
270 local _readbuffer = sender.readbuffer; | |
271 function sender.readbuffer() | |
272 _readbuffer(); | |
273 if not sender_locked and receiver.bufferlen() >= sender_lock_threshold then | |
274 sender_locked = true; | |
275 sender:lock(true); | |
276 end | |
277 end | |
278 end |