nodejs 实现简单 http 代理并缓存

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)

 

转载于:https://www.cnblogs.com/vaal-water/p/3492913.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值