Skip to content

Commit d7530dc

Browse files
committed
Merge branch 'feature-https-new' into develop
* feature-https-new: Allow regular strings and objects as SSL options. Remove protocol setting in favor of baseURL. Add localhost testing certificate. Added baseUrl protocol preference Added defaults Added HTTPS support
2 parents 2d6a3e8 + 44e0e88 commit d7530dc

6 files changed

+123
-6
lines changed

bin/ldf-server

+4-2
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ var configDefaults = JSON.parse(fs.readFileSync(path.join(__dirname, '../config/
2020
config = _.defaults(JSON.parse(fs.readFileSync(args[0])), configDefaults),
2121
port = parseInt(args[1], 10) || config.port,
2222
workers = parseInt(args[2], 10) || config.workers,
23+
protocolMatch = (config.baseURL || '').match(/^(\w+):/),
24+
protocol = config.protocol = protocolMatch ? protocolMatch[1] : 'http',
2325
constructors = {};
2426

2527
// Start up a cluster master
2628
if (cluster.isMaster) {
2729
// Create workers
28-
console.log('Master %d running on http://localhost:%d/.', process.pid, port);
30+
console.log('Master %d running on %s://localhost:%d/.', process.pid, protocol, port);
2931
for (var i = 0; i < workers; i++)
3032
cluster.fork();
3133

@@ -170,7 +172,7 @@ else {
170172
function startWhenReady() {
171173
if (!--pending) {
172174
server.listen(port);
173-
console.log('Worker %d running on http://localhost:%d/.', process.pid, port);
175+
console.log('Worker %d running on %s://localhost:%d/.', process.pid, protocol, port);
174176
}
175177
}
176178

config/config-defaults.json

+8
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,13 @@
4747
]
4848
},
4949

50+
"ssl": {
51+
"keys" : {
52+
"key": "config/localhost.key",
53+
"cert": "config/localhost.crt",
54+
"ca": []
55+
}
56+
},
57+
5058
"logging": { "enabled": false, "file": "access.log" }
5159
}

config/localhost.crt

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIE/TCCAuWgAwIBAgIJANiezJPdtqmLMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
3+
BAMMCWxvY2FsaG9zdDAgFw0xNjA5MjYwODI5MTRaGA8yMTE2MDkwMjA4MjkxNFow
4+
FDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
5+
CgKCAgEAqkOBZUTxnRl2r95BLFb2rHFtm/68mqm9zYPvk4q/Oz/ubKVaDo1JFPSO
6+
94fKVAcLlZErM4tc4XJxSfYP0B4vBRqzY/T1APU2BIcHXkByrc1Z65Gx4uJAR5LM
7+
v1aLoPFhAufcGHn7uQbyiF8wk2z1NfsbGtgS515d2+MikLmKUDyh+lRxn+ax31kZ
8+
Adv4kmbCrdKhvNUutqsomJdYPgsoZxDHCKsFjx8pjKITv0OBlART8kVUsyTnnODV
9+
ifDOM2bvawetem5J3n/l6f62JI2NkANirJm0+YwgDBwjp8GE1smg+7vWNRuHBRFk
10+
B8h/qbwnWVX5RblX11BewdbnqkIX7W968esoDGvdZYq8Yu4bhpd8u2VEM/Yf2pEW
11+
n1/1d+K4/mzg3uNk6BCzaW9daVCotJeK93LAbFN/tpIr9ON/5tJSB3jiaUPlZcwL
12+
Tl+PQjjsNcBJwLYF3hup/G/0lhAp3TkohK1Q8CJOMm7MR8LcLysBR6KhCceqAEdX
13+
go/vtuaDFpxCGVvnJ5F8omynA/GuYiEgRWm26wSjLoG40QruPABUmR5QL8AZLAdX
14+
8zEKsl3RrFOptgEcPIl5rC5Q+D4jOy4nnyziAcDXSr1ZJhTbI764OhbETSCfw+Uy
15+
qb/wPSbmFgONWsYo2XCJnP2g0L1FjPyW3P+SLTgQsaCtESIdYJUCAwEAAaNQME4w
16+
HQYDVR0OBBYEFD24R76BIkz9kfv+2jvfxuinU06mMB8GA1UdIwQYMBaAFD24R76B
17+
Ikz9kfv+2jvfxuinU06mMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIB
18+
AHmO4zfSOHMSHYYlPRgO3DJImbP/MDG3wDv2QRej3iZ65pu8Eu0qyRR3qt7aS+IT
19+
xkGSuFNeP2fYcQ8o2heWzyURzNtzkOOJotRPXQjgfjOLgc98VlEpJkYmh7up7WHk
20+
34cDl+87+p8mhxYfPwVs1Y67OhKt3Z3t5qvuJCnvCsCjzu8tIvNpwSIUc0QsQ6ty
21+
ddD4FnlYVepI4BOsAXlxPlPfnUMi0nMEQA5liRQIIWBCJ8COYhFo20uX4+CwVRnU
22+
uhy90Lh51fBV+/vG6d3LHfYnGC6nI5YCfgrSTNOwi8xjltJDh/7ifgE8nMDn6AN0
23+
hbVJKSFSgpEI/lnWsmsyngfpohLncsGM24F1iUTVng5pOUCBK0Hs5VgsEMW4WVHA
24+
SeB/Or/IUJ5a6DX/Hzgdb5wZ7fzTuoCl9ZQOxRDkuiSObUeXP00E+94cj2IEhxzx
25+
HSvN4HQyb7qRovfzt9kvKFk/GU4pFmjHIX/UhUisFL9TmibLQT4CpbLpoQdR2E3p
26+
VJ8MTV9LO3IbrRQilE78HzWpTNurnkbFUM/AG+SAkUgOTZrBj9lNfDcfDMqQPkVN
27+
oK6pLKQff3HAN4e6ZcfcjWyxjqjqxcvhJnKjkcEiZeEiLGL6GcnORogt/0YYMLeH
28+
GL8DU/OvuQDbrQY4i06JZb6Yk6mEda36Qm1YK0ttWmTv
29+
-----END CERTIFICATE-----

config/localhost.key

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
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
51+
-----END RSA PRIVATE KEY-----

lib/LinkedDataFragmentsServer.js

+29-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
/*! @license MIT ©2014-2016 Ruben Verborgh - Ghent University / iMinds */
22
/* LinkedDataFragmentsServer is an HTTP server that provides access to Linked Data Fragments */
33

4-
var http = require('http'),
5-
_ = require('lodash'),
4+
var _ = require('lodash'),
5+
fs = require('fs'),
66
Util = require('./Util'),
77
ErrorController = require('./controllers/ErrorController');
88

99
// Creates a new LinkedDataFragmentsServer
1010
function LinkedDataFragmentsServer(options) {
11-
// Create the HTTP server
12-
var server = http.createServer(), sockets = 0;
11+
// Create the HTTP(S) server
12+
var server, sockets = 0;
13+
switch (options.protocol) {
14+
case 'http':
15+
server = require('http').createServer();
16+
break;
17+
case 'https':
18+
var httpsOptions = _.mapValues((options.ssl || {}).keys || {}, readHttpsOption);
19+
server = require('https').createServer(httpsOptions);
20+
break;
21+
default:
22+
throw new Error('The configured protocol ' + options.protocol + ' is invalid.');
23+
}
24+
// Copy over members
1325
for (var member in LinkedDataFragmentsServer.prototype)
1426
server[member] = LinkedDataFragmentsServer.prototype[member];
1527

@@ -117,4 +129,17 @@ LinkedDataFragmentsServer.prototype.stop = function () {
117129
}, this);
118130
};
119131

132+
// Reads the value of an option for the https module
133+
function readHttpsOption(value) {
134+
// Read each value of an array
135+
if (_.isArray(value))
136+
return value.map(readHttpsOption);
137+
// Certificates and keys can be strings or files
138+
else if (_.isString(value) && fs.existsSync(value))
139+
return fs.readFileSync(value);
140+
// Other strings and regular objects are also allowed
141+
else
142+
return value;
143+
}
144+
120145
module.exports = LinkedDataFragmentsServer;

test/LinkedDataFragmentsServer-test.js

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ describe('LinkedDataFragmentsServer', function () {
2323
server = new LinkedDataFragmentsServer({
2424
controllers: [controller],
2525
log: sinon.stub(),
26+
protocol: 'http',
2627
response: {
2728
headers: {
2829
'Access-Control-Allow-Origin': '*',
@@ -127,6 +128,7 @@ describe('LinkedDataFragmentsServer', function () {
127128
};
128129
server = new LinkedDataFragmentsServer({
129130
controllers: [controllerA, controllerB],
131+
protocol: 'http',
130132
log: sinon.stub(),
131133
});
132134
client = request.agent(server);

0 commit comments

Comments
 (0)