node-http-proxy 기반 스 크 립 트:기능 업데이트,GFW 차단 URL 을 빠 른 404 로 되 돌 릴 수 있 습 니 다.벽 밖의 CDN url 을 로 컬 host 로 표시 하 는 것 을 지원 합 니 다.

"use strict";
//to support let-of syntax;

var ProxyPort = 8888;

var http = require('http'),
    net = require('net'),
    url = require('url'),
    httpProxy = require('http-proxy'); //    Node 5.0,     npm install http-proxy --save

var proxy = httpProxy.createProxyServer({
    autoRewrite: true, //??
});

proxy.on('error', function (err, req, res) {
/*
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  res.end('httpProxy      IO  :URL='+req.url);
*/
});

function isBlockedByGFW(host){
    var exact_blocked_hosts = {
        "ajax.googleapis.com": true,
        "fonts.googleapis.com": true,
        "cdn.datatables.net": true,
        "www.google.com": true,
        "www.slideshare.net": true,
        "twitter.com": true,
        "botanwang.com": true,
        "facebook.com": true,
    };
    //TODO:           GFW     ?
    if( exact_blocked_hosts[host]==true )
        return true;
    var suffix_blocked_hosts = [
        ".facebook.com",
        ".google.com",
        ".googleapis.com",
    ];
    for( let suffix of suffix_blocked_hosts){
        if( host.endsWith(suffix) ){
            return true;
        }
    }
    return false;
}

function check_url_remapping_needed(url){
    var gfw_url_remapping = {
        "http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js": "http://127.0.0.1/jquery-1.12.3.min.js",
        "http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js": "http://127.0.0.1/jquery-1.12.3.min.js",
            //for http://www.menscyzo.com/
    };
    return gfw_url_remapping[url];
}

//  http CONNECT   https  :(  ,    https     )
function connect(cReq, cSock) {
    //console.log("CONNECT: cReq.url="+cReq.url);
    var u = url.parse('http://' + cReq.url);
    if (isBlockedByGFW(u.hostname)){
        //console.log("CONNECT to host="+u.hostname+" is blocked by GFW, fast-return 404 instead");
        cSock.write('HTTP/1.1 404 CONNECT request blocked to avoid GFW timeout\r
\r
'); cSock.end(); return; } var pSock = net.connect(u.port||80, u.hostname, function() { cSock.write('HTTP/1.1 200 Connection Established\r
\r
'); pSock.pipe(cSock); }).on('error', function(e) { console.log("CONNECT: error! "+e); cSock.end(); }); cSock.pipe(pSock); } var server = http.createServer(); server.on('request', function(req, res) { console.log("REQUEST req.url=" + req.url); var u = url.parse(req.url); //console.log("req.url-parsed.path=" + u.path); //u.path , u.pathname //console.log("REQUEST u="+JSON.stringify(u)); var mapped_local_url = check_url_remapping_needed(req.url); if (mapped_local_url){// CDN url localhost console.log("remap "+req.url+" to "+mapped_local_url); var mapped_u = url.parse(mapped_local_url);//? var options = { hostname: mapped_u.hostname, port: 80, path: mapped_u.path, method: 'GET', headers: req.headers, }; var proxy_request = http.request(options, (res2) => { res2.pipe(res); }); proxy_request.end(); } else if (u.hostname=="hm.baidu.com" && u.pathname.match(/h.js$/)){ // baidu js ; res.writeHead(500, { 'Connection': 'close', 'Content-Type': 'application/x-javascript' }); res.end(''); }else if (isBlockedByGFW(u.hostname)){ console.log("REQUEST host="+u.hostname+" is blocked by GFW, fast-return 404 instead"); res.writeHead(404, { 'Connection': 'close', //'Content-Type': 'application/x-javascript' }); res.end(''); } else{ proxy.web(req, res, { target: req.url, //needs apply patch https://github.com/gagern/node-http-proxy/commit/35000fc0d7dc0a6073ac37db097b73575a861d34 prependPath: false, secure: false }); } }).on('connect', connect) .on('error', function(err){ // error console.log(" : "+JSON.stringify(err)); }); console.log("node-proxy-server: listening on port "+ProxyPort) server.listen(ProxyPort);

남 겨 진 문제:현재 코드 가 처리 되 었 음 에 도 불구 하고 CONNECT 주소 가 gfw 에 의 해 차 단 된 상태 에서 404 로 되 돌아 가 연결 을 끊 었 지만 크롬 브 라 우 저 는 계속 CONNECT 요청 을 보 내 는 것 같 습 니 다.
Node 의 성능 이 좋 은 것 같 습 니 다.적어도 제 가 Python 으로 쓴 버 전보 다 좋 은 것 같 습 니 다.그리고 저 는 let-of 와=>문법 을 사용 해 보 았 습 니 다.하하

좋은 웹페이지 즐겨찾기