tg-redbird 0.12.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +23 -16
  2. package/lib/docker.js +22 -18
  3. package/lib/etcd-backend.js +32 -35
  4. package/lib/letsencrypt.js +41 -38
  5. package/lib/proxy.js +197 -238
  6. package/lib/redis-backend.js +84 -79
  7. package/package.json +17 -4
  8. package/.dockerignore +0 -1
  9. package/.eslintrc +0 -22
  10. package/.travis.yml +0 -21
  11. package/.vscode/launch.json +0 -30
  12. package/Dockerfile +0 -6
  13. package/gulpfile.js +0 -36
  14. package/hl-tests/64/proxy.js +0 -52
  15. package/hl-tests/letsencrypt/a.js +0 -36
  16. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/meta.json +0 -1
  17. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/private_key.json +0 -1
  18. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/regr.json +0 -1
  19. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/meta.json +0 -1
  20. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/private_key.json +0 -1
  21. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/regr.json +0 -1
  22. package/hl-tests/letsencrypt/certs/api/privkey.pem +0 -27
  23. package/hl-tests/letsencrypt/certs/api.com/privkey.pem +0 -27
  24. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/cert0.pem +0 -29
  25. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/chain0.pem +0 -27
  26. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/fullchain0.pem +0 -56
  27. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/privkey0.pem +0 -27
  28. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/cert.pem +0 -29
  29. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/chain.pem +0 -27
  30. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/fullchain.pem +0 -56
  31. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/privkey.pem +0 -27
  32. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/privkey.pem.bak +0 -27
  33. package/hl-tests/letsencrypt/certs/dash/.well-known/acme-challenge/abc +0 -1
  34. package/hl-tests/letsencrypt/certs/dash/privkey.pem +0 -27
  35. package/hl-tests/letsencrypt/certs/dash.com/privkey.pem +0 -27
  36. package/hl-tests/letsencrypt/certs/dash_/privkey.pem +0 -27
  37. package/hl-tests/letsencrypt/certs/dev-cert.pem +0 -17
  38. package/hl-tests/letsencrypt/certs/dev-csr.pem +0 -13
  39. package/hl-tests/letsencrypt/certs/dev-key.pem +0 -15
  40. package/hl-tests/letsencrypt/certs/example.com/privkey.pem +0 -27
  41. package/hl-tests/letsencrypt/certs/localhost/privkey.pem +0 -27
  42. package/hl-tests/letsencrypt/certs/renewal/caturra.exactbytes.com.conf +0 -67
  43. package/hl-tests/letsencrypt/certs/renewal/caturra.exactbytes.com.conf.bak +0 -68
  44. package/hl-tests/letsencrypt/proxy.js +0 -73
  45. package/hl-tests/paths.js +0 -19
  46. package/package-lock.json +0 -3269
  47. package/test/test_custom_resolver.js +0 -276
  48. package/test/test_hostheader.js +0 -141
  49. package/test/test_pathnames.js +0 -75
  50. package/test/test_register.js +0 -493
@@ -1,493 +0,0 @@
1
- "use strict";
2
-
3
- var Redbird = require('../');
4
- var expect = require('chai').expect;
5
- var Promise = require('bluebird');
6
-
7
- var opts = {
8
- bunyan: false /* {
9
- name: 'test',
10
- streams: [{
11
- path: '/dev/null',
12
- }]
13
- } */
14
- }
15
-
16
- describe("Route registration", function () {
17
- it("should register a simple route", function () {
18
- var redbird = Redbird(opts);
19
-
20
- expect(redbird.routing).to.be.an("object");
21
-
22
- redbird.register('example.com', '192.168.1.2:8080');
23
-
24
- expect(redbird.routing).to.have.property("example.com")
25
-
26
- return redbird.resolve('example.com').then(function (result) {
27
- expect(result).to.be.an("object");
28
-
29
- var host = redbird.routing["example.com"];
30
- expect(host).to.be.an("array");
31
- expect(host[0]).to.have.property('path')
32
- expect(host[0].path).to.be.eql('/');
33
- expect(host[0].urls).to.be.an('array');
34
- expect(host[0].urls.length).to.be.eql(1);
35
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.2:8080/');
36
-
37
- redbird.unregister('example.com', '192.168.1.2:8080');
38
-
39
- return redbird.resolve('example.com');
40
-
41
- })
42
- .then(function (result) {
43
- expect(result).to.be.an("undefined")
44
- redbird.close();
45
- });
46
- });
47
-
48
- it("should resolve domains as case insensitive", function () {
49
- var redbird = Redbird(opts);
50
-
51
- expect(redbird.routing).to.be.an("object");
52
-
53
- redbird.register('example.com', '192.168.1.2:8080');
54
-
55
- return redbird.resolve('Example.com').then(function (target) {
56
- expect(target).to.be.an("object");
57
- expect(target.urls[0].hostname).to.be.equal('192.168.1.2');
58
-
59
- redbird.close();
60
- });
61
- });
62
-
63
-
64
- it("should register multiple routes", function () {
65
- var redbird = Redbird(opts);
66
-
67
- expect(redbird.routing).to.be.an("object");
68
-
69
- redbird.register('example1.com', '192.168.1.2:8080');
70
- redbird.register('example2.com', '192.168.1.3:8081');
71
- redbird.register('example3.com', '192.168.1.4:8082');
72
- redbird.register('example4.com', '192.168.1.5:8083');
73
- redbird.register('example5.com', '192.168.1.6:8084');
74
-
75
- expect(redbird.routing).to.have.property("example1.com")
76
- expect(redbird.routing).to.have.property("example2.com")
77
- expect(redbird.routing).to.have.property("example3.com")
78
- expect(redbird.routing).to.have.property("example4.com")
79
- expect(redbird.routing).to.have.property("example5.com")
80
-
81
- var host;
82
-
83
- host = redbird.routing["example1.com"];
84
- expect(host[0].path).to.be.eql('/');
85
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.2:8080/');
86
-
87
- host = redbird.routing["example2.com"];
88
- expect(host[0].path).to.be.eql('/');
89
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.3:8081/');
90
-
91
- host = redbird.routing["example3.com"];
92
- expect(host[0].path).to.be.eql('/');
93
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.4:8082/');
94
-
95
- host = redbird.routing["example4.com"];
96
- expect(host[0].path).to.be.eql('/');
97
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.5:8083/');
98
-
99
- host = redbird.routing["example5.com"];
100
- expect(host[0].path).to.be.eql('/');
101
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.6:8084/');
102
-
103
- redbird.unregister('example1.com');
104
-
105
- return redbird.resolve('example1.com').then(function (result) {
106
- expect(result).to.be.an("undefined")
107
-
108
- redbird.unregister('example2.com');
109
- return redbird.resolve('example2.com');
110
- })
111
- .then(function (result) {
112
- expect(result).to.be.an("undefined")
113
-
114
- redbird.unregister('example3.com');
115
- return redbird.resolve('example3.com');
116
- })
117
- .then(function (result) {
118
- expect(result).to.be.an("undefined")
119
-
120
- redbird.unregister('example4.com');
121
- return redbird.resolve('example4.com');
122
- })
123
- .then(function (result) {
124
- expect(result).to.be.an("undefined")
125
-
126
- redbird.unregister('example5.com');
127
- return redbird.resolve('example5.com');
128
- })
129
- .then(function (result) {
130
- expect(result).to.be.an("undefined")
131
- redbird.close();
132
- })
133
-
134
- })
135
- it("should register several pathnames within a route", function () {
136
- var redbird = Redbird(opts);
137
-
138
- expect(redbird.routing).to.be.an("object");
139
-
140
- redbird.register('example.com', '192.168.1.2:8080');
141
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
142
- redbird.register('example.com/foo', '192.168.1.3:8080');
143
- redbird.register('example.com/bar', '192.168.1.4:8080');
144
-
145
- expect(redbird.routing).to.have.property("example.com")
146
-
147
- var host = redbird.routing["example.com"];
148
- expect(host).to.be.an("array");
149
- expect(host[0]).to.have.property('path')
150
- expect(host[0].path).to.be.eql('/qux/baz');
151
- expect(host[0].urls).to.be.an('array');
152
- expect(host[0].urls.length).to.be.eql(1);
153
- expect(host[0].urls[0].href).to.be.eql('http://192.168.1.5:8080/');
154
-
155
- expect(host[0].path.length).to.be.least(host[1].path.length)
156
- expect(host[1].path.length).to.be.least(host[2].path.length)
157
- expect(host[2].path.length).to.be.least(host[3].path.length)
158
-
159
- redbird.unregister('example.com');
160
- return redbird.resolve('example.com').then(function (result) {
161
- expect(result).to.be.an("undefined")
162
- return redbird.resolve('example.com', '/foo');
163
- })
164
- .then(function (result) {
165
- expect(result).to.be.an("object")
166
-
167
- redbird.unregister('example.com/foo');
168
- return redbird.resolve('example.com', '/foo');
169
- })
170
- .then(function (result) {
171
- expect(result).to.be.an("undefined")
172
-
173
- redbird.close();
174
- });
175
- })
176
- it("shouldnt crash process in unregister of unregisted host", function (done) {
177
- var redbird = Redbird(opts);
178
-
179
- redbird.unregister('example.com');
180
-
181
- done()
182
-
183
- redbird.close();
184
- })
185
- })
186
-
187
- describe("Route resolution", function () {
188
- it("should resolve to a correct route", function () {
189
- var redbird = Redbird(opts);
190
-
191
- expect(redbird.routing).to.be.an("object");
192
-
193
- redbird.register('example.com', '192.168.1.2:8080');
194
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
195
- redbird.register('example.com/foo', '192.168.1.3:8080');
196
- redbird.register('example.com/bar', '192.168.1.4:8080');
197
- redbird.register('example.com/foo/baz', '192.168.1.3:8080');
198
-
199
- return redbird.resolve('example.com', '/foo/asd/1/2').then(function (route) {
200
- expect(route.path).to.be.eql('/foo')
201
- expect(route.urls.length).to.be.eql(1);
202
- expect(route.urls[0].href).to.be.eql('http://192.168.1.3:8080/');
203
-
204
- redbird.close();
205
- });
206
- })
207
-
208
- it("should resolve to a correct route with complex path", function () {
209
- var redbird = Redbird(opts);
210
-
211
- expect(redbird.routing).to.be.an("object");
212
-
213
- redbird.register('example.com', '192.168.1.2:8080');
214
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
215
- redbird.register('example.com/foo', '192.168.1.3:8080');
216
- redbird.register('example.com/bar', '192.168.1.4:8080');
217
- redbird.register('example.com/foo/baz', '192.168.1.7:8080');
218
-
219
- return redbird.resolve('example.com', '/foo/baz/a/b/c').then(function (route) {
220
- expect(route.path).to.be.eql('/foo/baz')
221
- expect(route.urls.length).to.be.eql(1);
222
- expect(route.urls[0].href).to.be.eql('http://192.168.1.7:8080/');
223
-
224
- redbird.close();
225
- });
226
- })
227
-
228
- it("should resolve to undefined if route not available", function () {
229
- var redbird = Redbird(opts);
230
-
231
- expect(redbird.routing).to.be.an("object");
232
-
233
- redbird.register('example.com', '192.168.1.2:8080');
234
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
235
- redbird.register('example.com/foo', '192.168.1.3:8080');
236
- redbird.register('foobar.com/bar', '192.168.1.4:8080');
237
- redbird.register('foobar.com/foo/baz', '192.168.1.3:8080');
238
-
239
- return redbird.resolve('wrong.com').then(function (route) {
240
- expect(route).to.be.an('undefined')
241
-
242
- return redbird.resolve('foobar.com');
243
- })
244
- .then(function (route) {
245
- expect(route).to.be.an('undefined')
246
-
247
- redbird.close();
248
- });
249
- })
250
-
251
- it("should get a target if route available", function () {
252
- var redbird = Redbird(opts);
253
-
254
- expect(redbird.routing).to.be.an("object");
255
-
256
- redbird.register('example.com', '192.168.1.2:8080');
257
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
258
- redbird.register('example.com/foo', '192.168.1.3:8080');
259
- redbird.register('foobar.com/bar', '192.168.1.4:8080');
260
- redbird.register('foobar.com/foo/baz', '192.168.1.7:8080');
261
- redbird.register('foobar.com/media', '192.168.1.7:8080');
262
-
263
- return redbird.resolve('example.com', '/qux/a/b/c').then(function (route) {
264
- expect(route.path).to.be.eql('/');
265
-
266
- return redbird.resolve('foobar.com', '/medias/');
267
- })
268
- .then(function (route) {
269
- expect(route).to.be.undefined;
270
-
271
- return redbird.resolve('foobar.com', '/mediasa');
272
- })
273
- .then(function (route) {
274
- expect(route).to.be.undefined;
275
- return redbird.resolve('foobar.com', '/media/sa');
276
- })
277
- .then(function (route) {
278
- expect(route.path).to.be.eql('/media');
279
-
280
- return redbird._getTarget('example.com', { url: '/foo/baz/a/b/c' });
281
- })
282
- .then(function (target) {
283
- expect(target.href).to.be.eql('http://192.168.1.3:8080/')
284
-
285
- redbird.close();
286
- });
287
- })
288
-
289
- it("should get a target with path when necessary", function () {
290
- var redbird = Redbird(opts);
291
-
292
- expect(redbird.routing).to.be.an("object");
293
-
294
- redbird.register('example.com', '192.168.1.2:8080');
295
- redbird.register('example.com/qux/baz', '192.168.1.5:8080');
296
- redbird.register('example.com/foo', '192.168.1.3:8080/a/b');
297
- redbird.register('foobar.com/bar', '192.168.1.4:8080');
298
- redbird.register('foobar.com/foo/baz', '192.168.1.7:8080');
299
-
300
- var req = { url: '/foo/baz/a/b/c' }
301
- return redbird.resolve('example.com', '/qux/a/b/c').then(function (route) {
302
- expect(route.path).to.be.eql('/');
303
-
304
- return redbird._getTarget('example.com', req);
305
- })
306
- .then(function (target) {
307
- expect(target.href).to.be.eql('http://192.168.1.3:8080/a/b')
308
- expect(req.url).to.be.eql('/a/b/baz/a/b/c')
309
-
310
- redbird.close();
311
- });
312
- })
313
- })
314
-
315
- describe("TLS/SSL", function () {
316
- it("should allow TLS/SSL certificates", function () {
317
- var redbird = Redbird({
318
- ssl: {
319
- port: 4430
320
- },
321
- bunyan: false
322
- });
323
-
324
- expect(redbird.routing).to.be.an("object");
325
- redbird.register('example.com', '192.168.1.1:8080', {
326
- ssl: {
327
- key: 'dummy',
328
- cert: 'dummy'
329
- }
330
- });
331
-
332
- redbird.register('example.com', '192.168.1.2:8080');
333
-
334
- expect(redbird.certs).to.be.an("object");
335
- expect(redbird.certs['example.com']).to.be.an("object");
336
-
337
- redbird.unregister('example.com', '192.168.1.1:8080');
338
-
339
- return redbird.resolve('example.com').then(function (result) {
340
- expect(result).to.not.be.an("undefined")
341
- expect(redbird.certs['example.com']).to.not.be.an("undefined");
342
- redbird.unregister('example.com', '192.168.1.2:8080');
343
-
344
- return redbird.resolve('example.com');
345
- })
346
- .then(function (result) {
347
- expect(result).to.be.an("undefined")
348
- expect(redbird.certs['example.com']).to.be.an("undefined");
349
- });
350
-
351
- })
352
- it('Should bind https servers to different ip addresses', function(testDone) {
353
-
354
- var isPortTaken = function(port, ip, done) {
355
- var net = require('net')
356
- var tester = net.createServer()
357
- .once('error', function (err) {
358
- if (err.code != 'EADDRINUSE') return done(err)
359
- done(null, true)
360
- })
361
- .once('listening', function() {
362
- tester.once('close', function() { done(null, false) })
363
- .close()
364
- })
365
- .listen(port, ip)
366
- }
367
-
368
- var redbird = Redbird({
369
- bunyan: false,
370
- port: 8080,
371
-
372
- // Specify filenames to default SSL certificates (in case SNI is not supported by the
373
- // user's browser)
374
- ssl: [
375
- {
376
- port: 4433,
377
- key: 'dummy',
378
- cert: 'dummy',
379
- ip: '127.0.0.1'
380
- },
381
- {
382
- port: 4434,
383
- key: 'dummy',
384
- cert: 'dummy',
385
- ip: '127.0.0.1'
386
- }
387
- ]
388
- });
389
-
390
- redbird.register('mydomain.com', 'http://127.0.0.1:8001', {
391
- ssl: {
392
- key: 'dummy',
393
- cert: 'dummy',
394
- ca: 'dummym'
395
- }
396
- });
397
-
398
- var portsTaken = 0;
399
- var portsChecked = 0;
400
-
401
- function portsTakenDone(err, taken) {
402
- portsChecked++;
403
- if (err) { throw err; }
404
- if (taken) { portsTaken++; }
405
- if ( portsChecked == 2 ) {
406
- portsCheckDone();
407
- }
408
- }
409
-
410
- function portsCheckDone() {
411
- expect(portsTaken).to.be.eql(2);
412
- redbird.close();
413
- testDone();
414
- }
415
-
416
- isPortTaken(4433, '127.0.0.1', portsTakenDone);
417
- isPortTaken(4434, '127.0.0.1', portsTakenDone);
418
- });
419
- })
420
-
421
-
422
- describe("Load balancing", function () {
423
- it("should load balance between several targets", function () {
424
- var redbird = Redbird(opts);
425
-
426
- expect(redbird.routing).to.be.an("object");
427
-
428
- redbird.register('example.com', '192.168.1.1:8080');
429
- redbird.register('example.com', '192.168.1.2:8080');
430
- redbird.register('example.com', '192.168.1.3:8080');
431
- redbird.register('example.com', '192.168.1.4:8080');
432
-
433
- expect(redbird.routing['example.com'][0].urls.length).to.be.eql(4);
434
- expect(redbird.routing['example.com'][0].rr).to.be.eql(0);
435
-
436
-
437
- return redbird.resolve('example.com', '/foo/qux/a/b/c').then(function (route) {
438
- expect(route.urls.length).to.be.eql(4);
439
-
440
- return Promise.each(Array(1000).fill(null), function () {
441
- return redbird._getTarget('example.com', { url: '/a/b/c' }).then(function (target) {
442
- expect(target.href).to.be.eql('http://192.168.1.1:8080/')
443
- expect(redbird.routing['example.com'][0].rr).to.be.eql(1);
444
-
445
- return redbird._getTarget('example.com', { url: '/x/y' });
446
- })
447
- .then(function (target) {
448
- expect(target.href).to.be.eql('http://192.168.1.2:8080/')
449
- expect(redbird.routing['example.com'][0].rr).to.be.eql(2);
450
-
451
- return redbird._getTarget('example.com', { url: '/j' });
452
- })
453
- .then(function (target) {
454
- expect(target.href).to.be.eql('http://192.168.1.3:8080/')
455
- expect(redbird.routing['example.com'][0].rr).to.be.eql(3);
456
-
457
- return redbird._getTarget('example.com', { url: '/k/' });
458
- })
459
- .then(function (target) {
460
- expect(target.href).to.be.eql('http://192.168.1.4:8080/')
461
- expect(redbird.routing['example.com'][0].rr).to.be.eql(0);
462
- });
463
- });
464
- })
465
- .then(function () {
466
- redbird.unregister('example.com', '192.168.1.1:8080');
467
- return redbird.resolve('example.com');
468
- })
469
- .then(function (result) {
470
- expect(result).to.not.be.an("undefined")
471
-
472
- redbird.unregister('example.com', '192.168.1.2:8080');
473
- return redbird.resolve('example.com');
474
- })
475
- .then(function (result) {
476
- expect(result).to.not.be.an("undefined")
477
- redbird.unregister('example.com', '192.168.1.3:8080');
478
-
479
- return redbird.resolve('example.com');
480
- })
481
- .then(function (result) {
482
- expect(result).to.not.be.an("undefined")
483
- redbird.unregister('example.com', '192.168.1.4:8080');
484
-
485
- return redbird.resolve('example.com');
486
- })
487
- .then(function (result) {
488
- expect(result).to.be.an("undefined")
489
-
490
- redbird.close();
491
- })
492
- });
493
- });