Delivering proxied GET response from ExpressJS server to client requesting data from url with query param.
curl http://host?url=https://yourUrl.com
Route for proxy – Pipe data to response stream
var Router = require('express').Router()
var https = require('https')
Router.get('/', function (req, res, next) {
https.get(req.query.url, (data) => {
//remove express headers
Object.keys(res.getHeaders()).forEach((headerName) => {
res.removeHeader(headerName)
})
// write status
res.status = data.statusCode
// write headers
Object.keys(data.headers).forEach((headerName) => {
res.setHeader(headerName, data.headers[headerName])
})
//Pipe data to response stream
data.pipe(res)
})
})
module.exports=Router
Route for proxy – Transform data and pipe to response stream
- Not a standalone file, implemented as route in express with app.use()
var router = require('express').Router()
var https = require('https')
// create and prepare stream
var {Readable} = require('stream')
var readStream = Readable()
readStream._read = function () {}
router.get('/', function(req, res, next) {
https.get(req.query.url, (data) => {
//remove express headers
Object.keys(res.getHeaders()).forEach((headerName) => {
res.removeHeader(headerName)
})
// write status
res.status = data.statusCode
// write headers
Object.keys(data.headers).forEach((headerName) => {
res.setHeader(headerName, data.headers[headerName])
})
data.on('data', (chunk) => {
// transform data here
var i = chunk.toString('utf8')
// UpperCase all letters
readStream.push(i.toUpperCase())
console.log(readStream.readableFlowing === true)
}).on('end', () => {
// readableStream does not invoke automatic end, whereas data.pipe(res) would do that
readStream.unpipe(res)
readStream.destroy()
console.log('is still flowing?', readStream.readableFlowing === true)
console.log('is destroyed', readStream.destroyed === true)
return res.end()
})
readStream.pipe(res, {
end: true
})
})
})
module.exports = router
0 comments on “NodeJS proxy router streams implementation example for ExpressJS”