使用 electron 写的客户端 , 需要用到一个代理的功能,目前是直接使用 http 代理,设置远程的 proxy-server 地址即可。 走的是 http 、https 代理,代码在最下面。
######### ############
本地客户端 -proxy-> proxy server -> 指定网站
######### ############
希望在本地增加一个 socks5
的代理层,数据转换后通过 http\websockets 到 proxy server, 类似这样
######### ########### ############
本地客户端 -socks5-> local proxy -proxy-> proxy server -> 指定网站
######### ########### ############
求赐教!!
服务器端代理的源码
const http = require('http')
const net = require('net')
const port = 1080
function buildHeaders(headers) {
const arr = []
for (const [k, v] of Object.entries(headers)) {
arr.push(`${k}:${v}\r\n`)
}
return arr.join('')
}
function getHostAndPort(req) {
let host
let port
try {
;[host, port] = new URL(req.url)
} catch (e) {
;[host, port] = req.headers.host.split(':')
} finally {
if (!port) {
port = 80
}
}
console.log(host, port)
return [host, port]
}
const server = http.createServer((req, res) => {
const [host, port] = getHostAndPort(req)
http.get(
{
port,
host,
path: req.url
},
response => {
response.pipe(res)
}
)
})
server.on('upgrade', (req, res, head) => {
const [host, port] = getHostAndPort(req)
const client = net.connect({
port,
host
})
client.on('connect', () => {
client.write(`GET ${req.url}\r\n` + buildHeaders(req.headers) + '\r\n')
res.pipe(client)
client.pipe(res)
})
client.on('error', () => {
res.destroy()
})
})
server.on('connect', (req, client, head) => {
const [host, port] = getHostAndPort(req)
const socket = net.connect(port, host, () => {
console.log('connect', port, host, head)
client.write('HTTP/1.1 200 Connection Established\r\n' + 'Proxy-agent: Node.js-Proxy\r\n' + '\r\n')
socket.write(head)
socket.pipe(client)
client.pipe(socket)
})
})
server.listen(port, () => console.log(port))
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.