diff --git a/newrelic.js b/newrelic.js new file mode 100644 index 00000000..655d4250 --- /dev/null +++ b/newrelic.js @@ -0,0 +1,24 @@ +/** + * New Relic agent configuration. + * + * See lib/config.defaults.js in the agent distribution for a more complete + * description of configuration variables and their potential values. + */ +exports.config = { + /** + * Array of application names. + */ + app_name: ['Node Unblocker'], + /** + * Your New Relic license key. + */ + license_key: process.env.NEW_RELIC_LICENSE_KEY, + logging: { + /** + * Level at which to log. 'trace' is most useful to New Relic when diagnosing + * issues with the agent, 'info' and higher will impose the least overhead on + * production applications. + */ + level: 'info' + } +}; \ No newline at end of file diff --git a/nodeub.js b/nodeub.js new file mode 100644 index 00000000..be96d5a0 --- /dev/null +++ b/nodeub.js @@ -0,0 +1,79 @@ +/*************** + * node-unblocker: Web Proxy for evading firewalls and content filters, + * similar to CGIProxy or PHProxy + * + * + * This project is hosted on github: https://github.com/nfriedly/nodeunblocker.com + * + * By Nathan Friedly - http://nfriedly.com + * Released under the terms of the Affero GPL v3 + */ + +var url = require('url'); +var querystring = require('querystring'); +var express = require('express'); +var unblocker = require('unblocker'); +var Transform = require('stream').Transform; + +var app = express(); + +var google_analytics_id = process.env.GA_ID || null; + +function addGa(html) { + if (google_analytics_id) { + var ga = [ + "" + ].join("\n"); + html = html.replace("", ga + "\n\n"); + } + return html; +} + +function googleAnalyticsMiddleware(data) { + if (data.contentType == 'text/html') { + + // https://nodejs.org/api/stream.html#stream_transform + data.stream = data.stream.pipe(new Transform({ + decodeStrings: false, + transform: function(chunk, encoding, next) { + this.push(addGa(chunk.toString())); + next(); + } + })); + } +} + +var unblockerConfig = { + prefix: '/proxy/', + responseMiddleware: [ + googleAnalyticsMiddleware + ] +}; + + + +// this line must appear before any express.static calls (or anything else that sends responses) +app.use(unblocker(unblockerConfig)); + +// serve up static files *after* the proxy is run +app.use('/', express.static(__dirname + '/public')); + +// this is for users who's form actually submitted due to JS being disabled or whatever +app.get("/no-js", function(req, res) { + // grab the "url" parameter from the querystring + var site = querystring.parse(url.parse(req.url).query).url; + // and redirect the user to /proxy/url + res.redirect(unblockerConfig.prefix + site); +}); + +// for compatibility with gatlin and other servers, export the app rather than passing it directly to http.createServer +module.exports = app; diff --git a/package.json b/package.json index 96d7a978..6e32b515 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "app.js", "scripts": { "test": "test", - "start": "node app.js auth.js" + "start": "node app.js auth.js ./node_modules/gatling/gatling.js ./nodeub.js" }, "keywords": [ "proxy", @@ -21,6 +21,10 @@ "node-fetch": "^2.6.1", "sanitizer": "^0.1.3", "session": "^0.1.0", - "cookies": "0.4" + "cookies": "0.4", + "gatling": "~1.2.0", + "newrelic": "^1.20.2", + "through": "^2.3.8", + "unblocker": "*" } } \ No newline at end of file diff --git a/packagenode.json b/packagenode.json new file mode 100644 index 00000000..2f9ffbed --- /dev/null +++ b/packagenode.json @@ -0,0 +1,22 @@ +{ + "name": "nodeunblocker.com", + "description": "Web proxy for evading internet censorship", + "author": "Nathan Friedly - http://nfriedly.com", + "version": "1.0.0", + "private": true, + "homepage": "https://github.com/nfriedly/nodeunblocker.com/", + "dependencies": { + "express": "^4.13.0", + "gatling": "~1.2.0", + "newrelic": "^1.20.2", + "through": "^2.3.8", + "unblocker": "*" + }, + "engines": { + "node": ">=6" + }, + "scripts": { + "start": "node ./node_modules/gatling/gatling.js ./app.js" + }, + "license": "AGPL-3.0" +}