Annotate

mod_http_connect/mod_http_connect.lua @ 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
child 6314:706867e05809
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6313
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 module:set_global();
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local server = require "prosody.net.server";
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local async = require "prosody.util.async";
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local connect = require"prosody.net.connect".connect;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local basic = require "prosody.net.resolvers.basic";
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local sessions = {};
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local listeners = {};
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 function listeners.onconnect(conn)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local event = sessions[conn];
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local response = event.response;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 response.status_code = 200;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 response:send("");
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 response.conn:onwritable();
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 response.conn:setlistener(listeners, event);
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 server.link(conn, response.conn);
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 server.link(response.conn, conn);
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 response.conn = nil;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 function listeners.onattach(conn, event)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 sessions[conn] = event;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 function listeners.onfail(event, err)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local response = event.response;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 if assert(response) then
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 response.status_code = 500;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 response:send(err);
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 function listeners.ondisconnect(conn, err)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 module:depends("http");
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 module:provides("http", {
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 default_path = "/";
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 route = {
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 ["CONNECT /*"] = function(event)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 local request = event.request;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 local host, port = request.url.scheme, request.url.path;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 if port == "" then return 400 end
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 -- TODO proxy-auth here, presumably same as stun/turn?
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 local resolve = basic.new(host, port);
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 connect(resolve, listeners, nil, event)
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 return true;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end;
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 }
5bd4cbe2bfee mod_http_connect: HTTP CONNECT proxy
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 });