Software /
code /
prosody-modules
Changeset
6313:5bd4cbe2bfee
mod_http_connect: HTTP CONNECT proxy
Meant to allow anonymizing connections to remote HTTP Upload services
A work in progress
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 25 Jun 2025 15:21:00 +0200 |
parents | 6312:2488254c1bc2 |
children | 6314:706867e05809 |
files | mod_http_connect/mod_http_connect.lua |
diffstat | 1 files changed, 53 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_http_connect/mod_http_connect.lua Wed Jun 25 15:21:00 2025 +0200 @@ -0,0 +1,53 @@ +module:set_global(); + +local server = require "prosody.net.server"; +local async = require "prosody.util.async"; +local connect = require"prosody.net.connect".connect; +local basic = require "prosody.net.resolvers.basic"; + +local sessions = {}; + +local listeners = {}; + +function listeners.onconnect(conn) + local event = sessions[conn]; + local response = event.response; + response.status_code = 200; + response:send(""); + response.conn:onwritable(); + response.conn:setlistener(listeners, event); + server.link(conn, response.conn); + server.link(response.conn, conn); + response.conn = nil; +end + +function listeners.onattach(conn, event) + sessions[conn] = event; +end + +function listeners.onfail(event, err) + local response = event.response; + if assert(response) then + response.status_code = 500; + response:send(err); + end +end + +function listeners.ondisconnect(conn, err) +end + +module:depends("http"); +module:provides("http", { + default_path = "/"; + route = { + ["CONNECT /*"] = function(event) + local request = event.request; + local host, port = request.url.scheme, request.url.path; + if port == "" then return 400 end + -- TODO proxy-auth here, presumably same as stun/turn? + local resolve = basic.new(host, port); + connect(resolve, listeners, nil, event) + return true; + end; + } +});