SHOW:
|
|
- or go back to the newest paste.
1 | var http = require('http'); | |
2 | var url = require('url'); | |
3 | var winston = require('winston'); | |
4 | var logger = new (winston.Logger)({ | |
5 | transports: [ | |
6 | new (winston.transports.Console)(), | |
7 | new (winston.transports.File)({ filename: 'proxy.log', json: false }) | |
8 | ] | |
9 | }); | |
10 | var base_url; | |
11 | ||
12 | http.createServer(function (clientRequest, clientResponse) { | |
13 | logger.info('ENTERING createServer'); | |
14 | ||
15 | function makeProxyRequest(clientRequestUrl) { | |
16 | logger.info('ENTERING makeProxyRequest'); | |
17 | ||
18 | // hack! | |
19 | clientRequestUrl.protocol = 'http:'; | |
20 | ||
21 | if (typeof(clientRequestUrl.hostname) === "undefined") { | |
22 | clientRequestUrl.hostname = base_url.hostname; | |
23 | } | |
24 | ||
25 | logger.info('client url: ' + url.format(clientRequestUrl)); | |
26 | ||
27 | proxy = http.request(clientRequestUrl, proxyResponseHandler); | |
28 | proxy.on('error', function(e) { | |
29 | logger.error('problem with proxy request to ' | |
30 | + clientRequestUrl.host + '/' + clientRequestUrl.path | |
31 | + ': ' + JSON.stringify(e)); | |
32 | clientResponse.end(); | |
33 | }); | |
34 | proxy.end(); | |
35 | logger.info('EXITING makeProxyRequest'); | |
36 | } | |
37 | ||
38 | function proxyResponseHandler(proxyResponse) { | |
39 | logger.info('ENTERING proxyResponseHandler'); | |
40 | logger.info('status: ' + proxyResponse.statusCode); | |
41 | ||
42 | switch(proxyResponse.statusCode) { | |
43 | case 301: | |
44 | case 302: | |
45 | var new_url = url.parse(proxyResponse.headers['location']); | |
46 | if(typeof(new_url.host) !== 'undefined') { | |
47 | base_url = new_url; | |
48 | } | |
49 | logger.info('redirect received: ' + JSON.stringify(new_url)); | |
50 | makeProxyRequest(new_url); | |
51 | break; | |
52 | ||
53 | case 200: | |
54 | for(header in proxyResponse.headers) { | |
55 | logger.info(' ' + header + ': ' + proxyResponse.headers[header]); | |
56 | clientResponse.setHeader(header, proxyResponse.headers[header]); | |
57 | } | |
58 | ||
59 | clientResponse.writeHead(proxyResponse.statusCode); | |
60 | ||
61 | proxyResponse.on('data', function(data) { | |
62 | clientResponse.write(data); | |
63 | }); | |
64 | proxyResponse.on('end', function() { | |
65 | logger.info('end from origin'); | |
66 | clientResponse.end(); | |
67 | }); | |
68 | break; | |
69 | } | |
70 | logger.info('EXITING proxyResponseHandler'); | |
71 | } | |
72 | //////////////////////// Execution starts here ////////////////////////////// | |
73 | var tmp_url = url.parse(clientRequest.url.substring(1)); | |
74 | logger.info(JSON.stringify(tmp_url)); | |
75 | logger.info(tmp_url.host); | |
76 | if (typeof(tmp_url.host) !== 'undefined' && typeof(base_url) === 'undefined' ) { | |
77 | base_url = tmp_url; | |
78 | } | |
79 | makeProxyRequest(tmp_url); | |
80 | ||
81 | logger.info('EXITING createServer'); | |
82 | }).listen(8124); | |
83 | ||
84 | console.log('Server running at http://127.0.0.1:8124/'); |