Software / code / prosody
Comparison
plugins/mod_proxy65.lua @ 3004:c20b9fe1624b
mod_proxy65: Use new server.link to link proxied connections, now works with either connection backend
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 05 May 2010 15:31:18 +0100 |
| parent | 2729:7e0c35713bf5 |
| child | 3005:c49be80767ee |
comparison
equal
deleted
inserted
replaced
| 3003:48871a549b4c | 3004:c20b9fe1624b |
|---|---|
| 18 local st = require "util.stanza"; | 18 local st = require "util.stanza"; |
| 19 local componentmanager = require "core.componentmanager"; | 19 local componentmanager = require "core.componentmanager"; |
| 20 local config_get = require "core.configmanager".get; | 20 local config_get = require "core.configmanager".get; |
| 21 local connlisteners = require "net.connlisteners"; | 21 local connlisteners = require "net.connlisteners"; |
| 22 local sha1 = require "util.hashes".sha1; | 22 local sha1 = require "util.hashes".sha1; |
| 23 local server = require "net.server"; | |
| 23 | 24 |
| 24 local host, name = module:get_host(), "SOCKS5 Bytestreams Service"; | 25 local host, name = module:get_host(), "SOCKS5 Bytestreams Service"; |
| 25 local sessions, transfers, component, replies_cache = {}, {}, nil, {}; | 26 local sessions, transfers, component, replies_cache = {}, {}, nil, {}; |
| 26 | 27 |
| 27 local proxy_port = config_get(host, "core", "proxy65_port") or 5000; | 28 local proxy_port = config_get(host, "core", "proxy65_port") or 5000; |
| 28 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*"; | 29 local proxy_interface = config_get(host, "core", "proxy65_interface") or "*"; |
| 29 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host; | 30 local proxy_address = config_get(host, "core", "proxy65_address") or (proxy_interface ~= "*" and proxy_interface) or host; |
| 30 local proxy_acl = config_get(host, "core", "proxy65_acl"); | 31 local proxy_acl = config_get(host, "core", "proxy65_acl"); |
| 32 local max_buffer_size = 4096; | |
| 31 | 33 |
| 32 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" }; | 34 local connlistener = { default_port = proxy_port, default_interface = proxy_interface, default_mode = "*a" }; |
| 33 | 35 |
| 34 function connlistener.onincoming(conn, data) | 36 function connlistener.onincoming(conn, data) |
| 35 local session = sessions[conn] or {}; | 37 local session = sessions[conn] or {}; |
| 82 module:log("debug", "target connected ... "); | 84 module:log("debug", "target connected ... "); |
| 83 elseif transfers[sha].target ~= nil then | 85 elseif transfers[sha].target ~= nil then |
| 84 transfers[sha].initiator = conn; | 86 transfers[sha].initiator = conn; |
| 85 session.sha = sha; | 87 session.sha = sha; |
| 86 module:log("debug", "initiator connected ... "); | 88 module:log("debug", "initiator connected ... "); |
| 87 throttle_sending(conn, transfers[sha].target); | 89 server.link(conn, transfers[sha].target, max_buffer_size); |
| 88 throttle_sending(transfers[sha].target, conn); | 90 server.link(transfers[sha].target, conn, max_buffer_size); |
| 89 end | 91 end |
| 90 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) | 92 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) |
| 91 conn:lock_read(true) | 93 conn:lock_read(true) |
| 92 else | 94 else |
| 93 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.") | 95 module:log("warn", "Neither data transfer nor initial connect of a participator of a transfer.") |
| 260 module:log("error", "Possibly two proxy65 components are configured to share the same port."); | 262 module:log("error", "Possibly two proxy65 components are configured to share the same port."); |
| 261 end | 263 end |
| 262 | 264 |
| 263 connlisteners.start(module.host .. ':proxy65'); | 265 connlisteners.start(module.host .. ':proxy65'); |
| 264 component = componentmanager.register_component(host, handle_to_domain); | 266 component = componentmanager.register_component(host, handle_to_domain); |
| 265 local sender_lock_threshold = 4096; | |
| 266 function throttle_sending(sender, receiver) | |
| 267 sender:pattern(sender_lock_threshold); | |
| 268 local sender_locked; | |
| 269 local _sendbuffer = receiver.sendbuffer; | |
| 270 function receiver.sendbuffer() | |
| 271 _sendbuffer(); | |
| 272 if sender_locked and receiver.bufferlen() < sender_lock_threshold then | |
| 273 sender:lock_read(false); -- Unlock now | |
| 274 sender_locked = nil; | |
| 275 end | |
| 276 end | |
| 277 | |
| 278 local _readbuffer = sender.readbuffer; | |
| 279 function sender.readbuffer() | |
| 280 _readbuffer(); | |
| 281 if not sender_locked and receiver.bufferlen() >= sender_lock_threshold then | |
| 282 sender_locked = true; | |
| 283 sender:lock_read(true); | |
| 284 end | |
| 285 end | |
| 286 end |