Skip to content

Commit

Permalink
fix(https): Ensure HTTPS option is used in legacy mode + top level, re:
Browse files Browse the repository at this point in the history
  • Loading branch information
shakyShane committed Feb 5, 2015
1 parent bb40075 commit 799c0a5
Show file tree
Hide file tree
Showing 12 changed files with 310 additions and 432 deletions.
1 change: 1 addition & 0 deletions .jscs.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"preset": "google",
"validateIndentation": 4,
"requireOperatorBeforeLineBreak": [],
"validateQuoteMarks": "\"",
"requireSpacesInFunctionExpression": {
"beforeOpeningRoundBrace": true,
Expand Down
2 changes: 1 addition & 1 deletion .jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"curly": true,
"eqeqeq": true,
"immed": true,
"laxbreak": false,
"laxbreak": true,
"latedef": "nofunc",
"newcap": true,
"noarg": true,
Expand Down
18 changes: 0 additions & 18 deletions lib/public/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,7 @@ module.exports = function (browserSync, name, pjson) {

var config = merge(args.config)
.withMutations(function (item) {

if (!item.get("server") && !item.get("proxy")) {
item.set("open", false);
}

item.set("version", pjson.version);

if (item.get("files") === false) {
item.set("files", Immutable.List([]));
}

// Promote any url paths given to proxy to
// startPath option
if (item.get("proxy")) {
var path = item.getIn(["proxy", "path"]);
if (path !== "/") {
item.set("startPath", path);
}
}
fixSnippetOptions(item);
});

Expand Down
186 changes: 17 additions & 169 deletions lib/server/index.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,25 @@
"use strict";

var snippetUtils = require("./../snippet").utils;
var utils = require("./utils.js");
var connect = require("connect");
var _ = require("lodash");
var http = require("http");
var Immutable = require("immutable");
var https = require("https");
var foxy = require("foxy");
var fs = require("fs");

/**
*
*/
module.exports.plugin = function (bs, scripts) {

var debug = bs.debug;
var proxy = bs.options.get("proxy") || false;
var server = bs.options.get("server") || false;
var serverObj;

var snippet = (!server && !proxy);
var type = bs.options.get("mode");
var proxy = bs.options.get("proxy");
var server = bs.options.get("server");
var type = bs.options.get("mode");

if (server) {
serverObj = server.toJS();
serverObj.middleware = bs.pluginManager.hook("server:middleware", server.get("middleware") || null);
bs.setOption("server", Immutable.fromJS(serverObj));
bs.setOptionIn(
["server", "middleware"],
bs.pluginManager.hook("server:middleware", server.get("middleware") || null)
);
}

var bsServer = exports.createServer(bs.options, scripts, bs);
var bsServer = createServer(bs, scripts);

if (server || snippet) {
if (type === "server" || type === "snippet") {
debug("Static Server running ({magenta:%s}) ...", bs.options.get("scheme"));
}

Expand All @@ -53,166 +41,26 @@ module.exports.plugin = function (bs, scripts) {

/**
* Launch the server for serving the client JS plus static files
* @param {Object} options
* @param {String} clientScripts
* @param {BrowserSync} bs
* @param {String} clientScripts
* @returns {{staticServer: (http.Server), proxyServer: (http.Server)}}
*/
module.exports.createServer = function (options, clientScripts, bs) {
function createServer (bs, clientScripts) {

var proxy = options.get("proxy");
var server = options.get("server");
var proxy = bs.options.get("proxy");
var server = bs.options.get("server");

if (!proxy && !server) {
return createSnippetServer(options, clientScripts);
return require("./snippet-server")(bs, clientScripts);
}

if (proxy) {
return exports.createProxy(options, clientScripts, bs);
return require("./proxy-server")(bs, clientScripts);
}

if (server) {
return createServer(server, options, clientScripts);
return require("./static-server")(bs, clientScripts);
}
};

/**
* @param {Immutable.Map} server
* @param {Immutable.Map} options
* @param scripts
* @returns {*}
*/
function createServer (server, options, scripts) {

var middleware = server.get("middleware");
var secure = options.get("scheme") === "https";
var secureKey, secureCert;
var index, app;

index = server.get("index") || "index.html";

app = connect();

app.use(function handleOldIe (req, res, next) {
snippetUtils.isOldIe(req);
return next();
})
.use(options.getIn(["scriptPaths", "versioned"]), scripts)
.use(options.getIn(["scriptPaths", "path"]), scripts);

if (server.get("directory")) {
utils.addDirectory(app, server.get("baseDir"));
}

app.use(snippetUtils.getSnippetMiddleware(options.get("snippet"), options.get("snippetOptions")));

utils.addMiddleware(app, middleware);

utils.addBaseDir(app, server.get("baseDir"), index);

if (server.get("routes")) {
utils.addRoutes(app, server.get("routes").toJS());
}

if (secure) {
secureKey = fs.readFileSync(secure.key || __dirname + "/certs/server.key");
secureCert = fs.readFileSync(secure.cert || __dirname + "/certs/server.crt");
return {
server: https.createServer({key: secureKey, cert: secureCert}, app),
app: app
};
} else {
return {
server: http.createServer(app),
app: app
};
}
}

/**
* @param options
* @param scripts
* @returns {*}
*/
function createSnippetServer (options, scripts) {

var app = connect();

app.use(options.getIn(["scriptPaths", "versioned"]), scripts)
.use(options.getIn(["scriptPaths", "path"]), scripts);

return {
server: http.createServer(app),
app: app
};
}

/**
* @param options
* @param scripts
* @returns {*}
* @param {BrowserSync} bs
*/
module.exports.createProxy = function (options, scripts, bs) {

exports.checkProxyTarget(options.get("proxy"), function (err) {
if (err) {
bs.events.emit("config:warn", {msg: err});
}
});

var mw = [snippetUtils.getProxyMiddleware(scripts, options.getIn(["scriptPaths", "versioned"]))];
var pluginMw = bs.pluginManager.hook("server:middleware");

if (pluginMw.length) {
mw = mw.concat(pluginMw);
}

var snippetOptions = options.get("snippetOptions").toJS();
var foxyServer = foxy(options.getIn(["proxy", "target"]), {
rules: snippetUtils.getRegex(options.get("snippet"), options.get("snippetOptions")),
whitelist: snippetOptions.whitelist,
blacklist: snippetOptions.blacklist,
middleware: mw,
errHandler: function (err) {
bs.logger.debug("{red:[proxy error]} %s", err.message);
}
}
);

return {
server: foxyServer,
app: foxyServer.app
};
};

/**
* @param {Object} proxy
* @param {Function} cb
*/
module.exports.checkProxyTarget = function (proxy, cb) {

var chunks = [];
var errored = false;

function logError() {
if (!errored) {
cb("Proxy address not reachable - is your server running?");
errored = true;
}
}

require("http").get(proxy.get("target"), function (res) {
res.on("data", function (data) {
chunks.push(data);
});
}).on("error", function (err) {
if (_.contains(["ENOTFOUND", "ECONNREFUSED"], err.code)) {
logError();
}
}).on("close", function () {
if (!chunks.length) {
logError();
}
});
};
module.exports.createServer = createServer;
76 changes: 76 additions & 0 deletions lib/server/proxy-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"use strict";

var snippetUtils = require("./../snippet").utils;
var _ = require("lodash");
var foxy = require("foxy");

/**
* @param {BrowserSync} bs
* @param {String} scripts
* @returns {*}
*/
module.exports = function createProxyServer (bs, scripts) {

var options = bs.options;

checkProxyTarget(options.get("proxy"), function (err) {
if (err) {
bs.events.emit("config:warn", {msg: err});
}
});

var mw = [snippetUtils.getProxyMiddleware(scripts, options.getIn(["scriptPaths", "versioned"]))];
var pluginMw = bs.pluginManager.hook("server:middleware");

if (pluginMw.length) {
mw = mw.concat(pluginMw);
}

var snippetOptions = options.get("snippetOptions").toJS();
var foxyServer = foxy(options.getIn(["proxy", "target"]), {
rules: snippetUtils.getRegex(options.get("snippet"), options.get("snippetOptions")),
whitelist: snippetOptions.whitelist,
blacklist: snippetOptions.blacklist,
middleware: mw,
errHandler: function (err) {
bs.logger.debug("{red:[proxy error]} %s", err.message);
}
}
);

return {
server: foxyServer,
app: foxyServer.app
};
};

/**
* @param {Object} proxy
* @param {Function} cb
*/
function checkProxyTarget (proxy, cb) {

var chunks = [];
var errored = false;

function logError() {
if (!errored) {
cb("Proxy address not reachable - is your server running?");
errored = true;
}
}

require("http").get(proxy.get("target"), function (res) {
res.on("data", function (data) {
chunks.push(data);
});
}).on("error", function (err) {
if (_.contains(["ENOTFOUND", "ECONNREFUSED"], err.code)) {
logError();
}
}).on("close", function () {
if (!chunks.length) {
logError();
}
});
}
23 changes: 23 additions & 0 deletions lib/server/snippet-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"use strict";

var connect = require("connect");
var http = require("http");

/**
* Create a server for the snippet
* @param {BrowserSync} bs
* @param scripts
* @returns {*}
*/
module.exports = function createSnippetServer (bs, scripts) {

var app = connect();

app.use(bs.options.getIn(["scriptPaths", "versioned"]), scripts)
.use(bs.options.getIn(["scriptPaths", "path"]), scripts);

return {
server: http.createServer(app),
app: app
};
};
Loading

0 comments on commit 799c0a5

Please sign in to comment.