アップストリームの http.IncomingMessage を、restify サーバー経由でクライアントに転送したいと考えています。これが私が今まで思いついたものです。転送機能を提供します。ただし、これによりメモリリークが発生する可能性があると思います。
var server = restify.createServer()
server.get('/test', function(req, res, next) {
var upstreamReq = createUpstreamReq() // just creates a http.ClientRequest
upstreamReq.on('response', function(upstreamRes) {
if (upstreamRes.statusCode === 404) {
// (1) I guess this leaks the upstreamRes body ?
return next(new restify.errors.NotFoundError())
}
if (upstreamRes.statusCode !== 200) {
// (2) is there a better way than pipeing the response to /dev/null?
// I guess the advantage of this approach is that we can reuse the connection (not closed) ?
upstreamRes.pipe(fs.createWriteStream('/dev/null'))
return next(new restify.errors.InternalServerError())
}
res.setHeader('Content-Type', upstreamRes.header('Content-Type'))
res.setHeader('Content-Length', upstreamRes.header('Content-Length'))
upstreamRes.pipe(res)
return next()
})
upstreamReq.end()
})
- アップストリームの場合、このコードは決して消費されない (いいえ) ため、本体 (1) を
404
リークすると思いますか?upstreamRes
pipe(somewhere)
- ボディをリークしてはならない明白な解決策 (2) の 1 つ
upstreamRes
は、 にパイプすること/dev/null
です。この問題の代替/より良い解決策はありますか?