tlsjsonproxy
Version:
Creates a HTTP server that acts as a proxy to a JSON-RPC TLS socket-based interface
77 lines (62 loc) • 1.73 kB
JavaScript
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0
const tls = require('tls')
const fs = require('fs')
const http = require('http')
const path = require('path')
const remoteServer = process.argv[2]
const remotePort = process.argv[3]
const localPort = process.argv[4]
const localServer = process.argv[5]
if (!localPort || !remoteServer || !remotePort) {
console.log("\tUsage: \n\t"+path.basename(process.argv[0])+" "+path.basename(process.argv[1])+" <local port> <remote server> <remote port> [<local interface = 0.0.0.0>]")
process.exit()
}
const queue = {}
const socket = tls.connect({
host: remoteServer,
port: remotePort,
checkServerIdentity: () => null
}, () => {
console.log('client connected')
})
socket.setEncoding('utf8')
socket.on('data', data => {
try {
data = JSON.parse(data)
if (data.id && queue[data.id]) {
queue[data.id](data)
delete queue[data.id]
}
} catch (e) {
console.log(e)
}
})
socket.on('end', () => {
console.log('server ended connection');
});
const httpServer = http.createServer((req, res) => {
let data = []
req.on('data', chunk => data.push(chunk))
req.on('end', () => {
if (req.method !== 'POST') {
res.write("POST requests only")
return res.end()
}
try {
data = JSON.parse(data)
} catch (e) {
res.write("Malformed request")
return res.end()
}
let request_id = data.id || Math.random().toString(26).slice(2)
data.id = request_id
socket.write(JSON.stringify(data) + "\n")
queue[request_id] = response => {
res.writeHead(200, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' })
res.write(JSON.stringify(response))
res.end()
}
})
})
httpServer.listen(localPort, localServer)