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 와=>문법 을 사용 해 보 았 습 니 다.하하
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.