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/');