| #!/usr/bin/env node |
| |
| var path = require('path'), |
| fs = require('fs'), |
| util = require('util'), |
| argv = require('optimist').argv, |
| httpProxy = require('../lib/node-http-proxy'); |
| |
| var help = [ |
| "usage: node-http-proxy [options] ", |
| "", |
| "Starts a node-http-proxy server using the specified command-line options", |
| "", |
| "options:", |
| " --port PORT Port that the proxy server should run on", |
| " --host HOST Host that the proxy server should run on", |
| " --target HOST:PORT Location of the server the proxy will target", |
| " --config OUTFILE Location of the configuration file for the proxy server", |
| " --silent Silence the log output from the proxy server", |
| " --user USER User to drop privileges to once server socket is bound", |
| " -h, --help You're staring at it" |
| ].join('\n'); |
| |
| if (argv.h || argv.help || Object.keys(argv).length === 2) { |
| return util.puts(help); |
| } |
| |
| var location, config = {}, |
| port = argv.port || 80, |
| host = argv.host || undefined, |
| target = argv.target; |
| user = argv.user; |
| |
| // |
| // If we were passed a config, parse it |
| // |
| if (argv.config) { |
| try { |
| var data = fs.readFileSync(argv.config); |
| config = JSON.parse(data.toString()); |
| } catch (ex) { |
| util.puts('Error starting node-http-proxy: ' + ex); |
| process.exit(1); |
| } |
| } |
| |
| // |
| // If `config.https` is set, then load the required file contents into the config options. |
| // |
| if (config.https) { |
| Object.keys(config.https).forEach(function (key) { |
| // If CA certs are specified, load those too. |
| if (key === "ca") { |
| for (var i=0; i < config.https.ca.length; i++) { |
| if (config.https.ca === undefined) { |
| config.https.ca = []; |
| } |
| config.https.ca[i] = fs.readFileSync(config.https[key][i], 'utf8'); |
| } |
| } else { |
| config.https[key] = fs.readFileSync(config.https[key], 'utf8'); |
| } |
| }); |
| } |
| |
| // |
| // Check to see if we should silence the logs |
| // |
| config.silent = typeof argv.silent !== 'undefined' ? argv.silent : config.silent; |
| |
| // |
| // If we were passed a target, parse the url string |
| // |
| if (typeof target === 'string') location = target.split(':'); |
| |
| // |
| // Create the server with the specified options |
| // |
| var server; |
| if (location) { |
| var targetPort = location.length === 1 ? 80 : parseInt(location[1]); |
| server = httpProxy.createServer(targetPort, location[0], config); |
| } |
| else if (config.router) { |
| server = httpProxy.createServer(config); |
| } |
| else { |
| return util.puts(help); |
| } |
| |
| // |
| // Start the server |
| // |
| if (host) { |
| server.listen(port, host); |
| } else { |
| server.listen(port); |
| } |
| |
| |
| // |
| // Drop privileges if requested |
| // |
| if (typeof user === 'string') { |
| process.setuid(user); |
| } |
| |
| // |
| // Notify that the server is started |
| // |
| if (!config.silent) { |
| util.puts('node-http-proxy server now listening on port: ' + port); |
| } |