您的位置:首页 > 理论基础 > 计算机网络

nodejs 实现简单 http 代理并缓存

2013-12-26 18:41 447 查看
var http = require('http'),
fs = require("fs"),
url = require('url'),
querystring = require('querystring')

function onRequest(req, res) {
var reqUrl = req.url
if ('/' == reqUrl || 'favicon.ico' == reqUrl) {
return res.end('Im debugger')
}
var proxySet = req.headers.ps
console.log(proxySet)
if (proxySet)  proxySet = JSON.parse(proxySet)

proxySet = proxySet || {}
delete req.headers.ps
res.writeHead(200 ,{'Content-Type': 'text/plain','Cache-Control': 'no-cache,no-store'})

if (proxySet.cache){
var cacheFile = './cache/'+ proxySet.cache
if (!fs.existsSync(cacheFile)) fs.mkdirSync(cacheFile)
cacheFile += '/'+ reqUrl.replace(/^\//,'').replace(/\//g,'-')
if (fs.existsSync(cacheFile)){
console.log('from cache ' , cacheFile)
return fs.createReadStream(cacheFile).pipe(res)
}
}

var source = 'target.com'

delete req.headers['accept-encoding']

var httpProxy = getProxy(source , req ,res ,cacheFile)
req.pipe(httpProxy)

}

function getProxy(host , req ,res , cacheFile){
var backTimeoutTTL = 20000
req.headers.host = host
var options = {
host : host,
port : 80 ,
headers: req.headers,
path : req.url,
agent : false,
method : req.method ,
};
var request_timer;
var httpProxy = http.request(options , function(response) {
if (request_timer) clearTimeout(request_timer)
response.setEncoding('utf8')
response.pipe(res)
cacheFile && response.pipe(fs.createWriteStream(cacheFile))
});
httpProxy.on('error' , function(e){
res.end('error happend :' + req.url)
})
request_timer = setTimeout(function() {
console.log('request timeout [%s] %s' , host , req.url)
httpProxy.abort();
res.end('request timeout :' + req.url)
}, backTimeoutTTL);
return httpProxy

}

http.createServer(onRequest).listen(80)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: