Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to start ember serve on https #3550

Merged
merged 6 commits into from
May 20, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion lib/commands/serve.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ module.exports = Command.extend({
{ name: 'live-reload', type: Boolean, default: true, aliases: ['lr'] },
{ name: 'live-reload-port', type: Number, description: '(Defaults to port number + 31529)', aliases: ['lrp']},
{ name: 'environment', type: String, default: 'development', aliases: ['e', {'dev' : 'development'}, {'prod' : 'production'}] },
{ name: 'output-path', type: path, default: 'dist/', aliases: ['op', 'out'] }
{ name: 'output-path', type: path, default: 'dist/', aliases: ['op', 'out'] },
{ name: 'ssl', type: Boolean, default: false },
{ name: 'ssl-key', type: String, default: 'ssl/server.key' },
{ name: 'ssl-cert', type: String, default: 'ssl/server.crt' }
],

run: function(commandOptions) {
Expand Down
24 changes: 22 additions & 2 deletions lib/tasks/server/express-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
var path = require('path');
var EventEmitter = require('events').EventEmitter;
var chalk = require('chalk');
var fs = require('fs');
var debounce = require('lodash/function/debounce');
var mapSeries = require('promise-map-series');
var Promise = require('../../ext/promise');
Expand All @@ -16,6 +17,7 @@ module.exports = Task.extend({
this.emitter = new EventEmitter();
this.express = this.express || require('express');
this.http = this.http || require('http');
this.https = this.https || require('https');

var serverRestartDelayTime = this.serverRestartDelayTime || 100;
this.scheduleServerRestart = debounce(function(){
Expand All @@ -36,7 +38,11 @@ module.exports = Task.extend({
},

setupHttpServer: function() {
this.httpServer = this.http.createServer(this.app);
if (this.startOptions.ssl) {
this.httpServer = this.createHttpsServer();
} else {
this.httpServer = this.http.createServer(this.app);
}

// We have to keep track of sockets so that we can close them
// when we need to restart.
Expand All @@ -52,6 +58,20 @@ module.exports = Task.extend({
}.bind(this));
},

createHttpsServer: function() {
if(!fs.existsSync(this.startOptions.sslKey)) {
throw new TypeError('SSL key couldn\'t be found in "' + this.startOptions.sslKey + '", please provide a path to an existing ssl key file with --ssl-key');
}
if(!fs.existsSync(this.startOptions.sslKey)) {
throw new TypeError('SSL certificate couldn\'t be found in "' + this.startOptions.sslCert + '", please provide a path to an existing ssl certificate file with --ssl-cert');
}
var options = {
key: fs.readFileSync(this.startOptions.sslKey),
cert: fs.readFileSync(this.startOptions.sslCert)
};
return this.https.createServer(options, this.app);
},

listen: function(port, host) {
var server = this.httpServer;
return new Promise(function(resolve, reject) {
Expand Down Expand Up @@ -105,7 +125,7 @@ module.exports = Task.extend({
.then(function () {
var baseURL = cleanBaseURL(options.baseURL);

options.ui.writeLine('Serving on http://' + this.displayHost(options.host) + ':' + options.port + baseURL);
options.ui.writeLine('Serving on http' + (options.ssl ? 's' : '') + '://' + this.displayHost(options.host) + ':' + options.port + baseURL);
}.bind(this));
},

Expand Down
20 changes: 20 additions & 0 deletions tests/fixtures/ssl/server.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDLjCCAhYCCQClpT57IEXr0zANBgkqhkiG9w0BAQUFADBZMQswCQYDVQQGEwJB
VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMTUwMzE2MTk1NDIyWhcN
NDIwODAxMTk1NDIyWjBZMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0
ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRIwEAYDVQQDEwls
b2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqr6SuXrYh
T4cY2l+EvbxeBthuWIXNxGO50w3GfmqlVFG24Nl5+cpDWf0fr8d7eilqW6O05PTW
ZTKNPaLjf1AQ7HAm2Ql02Q6EWn0BUa9y8njhwdhP+QgcBphmkoSNWQ1+SQEXSIaF
91fq36/PGY+ZzqY31+OdyZhqEWDhaAdXlzjCZKTMBFijUo2GljJGQ47wpNSaXM1I
kvG1WAbEBB9gbwbbEy94bx23G8AIkzft5qUb8Trjzz4PsAc6RUdULYqmOrKBcfP2
i9pCkXtnpi9ESFSuC3T5Qycl4AcyowOvyln+DXI0YrVmqpJxtgP0iu42fZ7V+X6S
8B1gz4py9D8BAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAISek/NhWEd3EtTgJO8P
vT24abyUFxcIF6+6a4DHE6DylpRJ8Aw5xB4ebVBGw6xREbqsCvkDZlosvu0zJBL3
CabzQLB//JyQJ5kg+hqBeB3gk6dzzOmdbdP2Xj42Hvf72e+xO7eI9QPpAz3Sbx1g
plEBUFyQ3ZdX5SrOVGJWw9UeUO2DewETqw2ldRFd9H/Reeai63sY+8g8fXLPh2DW
6mU+5YclJpKZJmtiUbdpwoKuXJLtjAZ0T5JHSIY9Ddz+H3B8270EaDDFaTkwYs/6
ARcPqIRGcEmsvw+9JvcBHiaDc4bKfOk+fK9Styjbo07Hzy7UpIUXm73Wj0HwFaHf
A74=
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions tests/fixtures/ssl/server.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqq+krl62IU+HGNpfhL28XgbYbliFzcRjudMNxn5qpVRRtuDZ
efnKQ1n9H6/He3opalujtOT01mUyjT2i439QEOxwJtkJdNkOhFp9AVGvcvJ44cHY
T/kIHAaYZpKEjVkNfkkBF0iGhfdX6t+vzxmPmc6mN9fjncmYahFg4WgHV5c4wmSk
zARYo1KNhpYyRkOO8KTUmlzNSJLxtVgGxAQfYG8G2xMveG8dtxvACJM37ealG/E6
488+D7AHOkVHVC2KpjqygXHz9ovaQpF7Z6YvREhUrgt0+UMnJeAHMqMDr8pZ/g1y
NGK1ZqqScbYD9IruNn2e1fl+kvAdYM+KcvQ/AQIDAQABAoIBACeW/+qV+0a0rJA+
LoOagrOIgPDvRXHZyIvUgVB2CAR7D00M0ESzhI+kssqDuhBQ4IRT5x/RL1z/Mf+C
uWJtKEQUo1rPYpsgsXZPiskgikJuLU2n6aV7DL97ZCP+fhJPAos1IbSl1NYD7feD
lMLDmgRB41n2kEwL83c+uqrtty5AetB1XxaTURURPGV+DVyFtYzfh14Wp2UJsRTq
0xvrmBM/YXOtfkHcv54QDPBGZmS6JmysK0aT7efT0GMukKuUvkWjEzCkLWK05zpX
z9FZIWbUK5Kva5xVn7hEN2diNbt2lSeQul1wartuCFje9XsAY7Zy/F9k1xWtdVpr
bZZ9C8UCgYEA41+rhVPzcL/HM93xYo2wKBa0pWrDSWD3b5F2y1VR14v/VuYzJTTN
6/FHB7TmfYxvJdLUygOME48Jf8iAtXJjMBhMhEOvPsPUPJIVRughOm8QTiq5B0C3
8qGAXJqHj8CnEn4QlKr9V4rrgqZ2S7l43yqv5yGYs/ZMeBoKAYey4pcCgYEAwCzp
u9JcU1hDkOsszg+Xj22mNvByEMScQ6IJjI9OOnGjqejeUsrYjz5VeCyMISRxVLKc
JabMJH6RIyxVTcqX6tvHzYuGr6AtylSq2hfL6WYGY2S9JR+bUjFZQWl7JDbgCiVN
C+n7ld/Gebm2V3rZfqMkUSdDh9QfBbF2iJmzVicCgYA/ZzcqF63ju+athO9Bvybn
FuXK1smcFakJ+HM64hDPXV+XeNu8PUxKxd47vOslCVsZHgBuUKzn61QHyP5zGnGk
QLJdk44zn2H4fffm7OYPKFdQpMMxzY893mEv8Xtpz5wHIRY4jrHUjo17wjVsiky1
Vm70sb6mOEE8oG433QI6AwKBgBR7dPoAxLhZWvIyLpdT0BqIXEPUwsOIwQLwXUYu
6+6MuB3e5Ps8BXLW+PMTBGhv4uhdFQlqSq3FE6EFE55z7lcoz5XXviYv01GSTpdq
G+CncBzd2s7/HGXZPqMbI/XLJ3vNV/XiHV9u9093/Lg8LrwxlShVH/x1Hk1UCccr
YpLXAoGBAKYpmgybQrn51IPFHo66fvu/TR4G24OISORzhMq8wrNuIeWMaz5sjcv+
mNMoeQjHYYcySo9x9yJcMHMy2VoHLVxJnlsw44ujhJcQ+ZvBdNPqvuRqXXfYEJNB
l9ZULBlC/ChhqvCJ0KUEcKBeDFXpXyBqaGxfB24xKm73sWlhFL1d
-----END RSA PRIVATE KEY-----
38 changes: 38 additions & 0 deletions tests/unit/tasks/server/express-server-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ describe('express-server', function() {
describe('output', function() {
this.timeout(40000);

it('with ssl', function() {
return subject.start({
host: '0.0.0.0',
port: '1337',
ssl: true,
sslCert: 'tests/fixtures/ssl/server.crt',
sslKey: 'tests/fixtures/ssl/server.key',
baseURL: '/'
}).then(function() {
var output = ui.output.trim().split(EOL);
expect(output[0]).to.equal('Serving on https://localhost:1337/');
});
});

it('with proxy', function() {
return subject.start({
proxy: 'http://localhost:3001/',
Expand Down Expand Up @@ -144,6 +158,30 @@ describe('express-server', function() {
});

describe('behaviour', function() {
it('starts with ssl if ssl option is passed', function() {

return subject.start({
host: 'localhost',
port: '1337',
ssl: true,
sslCert: 'tests/fixtures/ssl/server.crt',
sslKey: 'tests/fixtures/ssl/server.key',
baseURL: '/'
})
.then(function() {
return new Promise(function(resolve, reject) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
request('https://localhost:1337', {strictSSL: false}).
get('/').expect(200, function(err, value) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '1';
if(err) { reject(err); }
else { resolve(value); }
});
});
});
}),


it('app middlewares are processed before the proxy', function(done) {
var expected = '/foo was hit';

Expand Down