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;
+	}
+});