Software / code / prosody-modules
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 |
| 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 }); |