forked from xk/nodeSnippets
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy.js
77 lines (61 loc) · 2.32 KB
/
proxy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//#!/usr/bin/env node
//201003xx [email protected]
//http://catonmat.net/http-proxy-in-nodejs
//modificado por [email protected]
//lanzar node proxy.js, y ajustar preferencias del sistema/network/web/http proxy al puerto 8080
//este proxy vuela por que lo guarda todo en cache (en RAM) hasta reventar, y no refresca nunca la cache:
//el contenido que guarda la primera vez, es el que va servir ya para siempre... :-)
//es un experimento y funciona bien, pero no un proxy que se pueda utilizar de verdad.
var http = require('http');
var sys = require('sys');
var Buffer= require('buffer').Buffer;
var cache= {};
function log (txt) {
sys.puts(txt.substr(0,60));
}
http.createServer(function (request, response) {
var logTxt= request.method+":"+request.url.substr(0,80);
var cached= cache[request.url];
var cacheItem;
if (cached && (request.method === "GET")) {
response.writeHead(200, cached.headers);
var i= 0;
while (i < cached.chunks.length) {
var chunk= cached.chunks[i++];
response.write(chunk);
}
response.end();
log("["+cached.chunks.length+"]chunks:fromCache:"+logTxt);
} else {
var proxy = http.createClient(80, request.headers['host'])
var proxy_request = proxy.request(request.method, request.url, request.headers);
if (request.method === "GET") {
cacheItem= { chunks: [], headers: "" };
}
proxy_request.addListener('response', function (proxy_response) {
if (proxy_response.statusCode !== 200) cacheItem= null;
proxy_response.addListener('data', function (chunk) {
if (cacheItem) cacheItem.chunks.push(chunk);
response.write(chunk);
sys.print(".");
});
proxy_response.addListener('end', function () {
if (cacheItem) {
cache[request.url]= cacheItem;
log(" CACHED:["+proxy_response.statusCode+"]:"+logTxt);
} else {
log("NOT CACHED:["+proxy_response.statusCode+"]:"+logTxt);
}
response.end();
});
if (cacheItem) cacheItem.headers= proxy_response.headers;
response.writeHead(proxy_response.statusCode, proxy_response.headers);
});
request.addListener('data', function (chunk) {
proxy_request.write(chunk);
});
request.addListener('end', function () {
proxy_request.end();
});
}
}).listen(8080);