From 51b4206721a333a14b7ff8e2341c6a3a8fc7a632 Mon Sep 17 00:00:00 2001 From: Islam Sharabash Date: Wed, 18 May 2016 17:49:29 -0700 Subject: [PATCH] feat: adding support for before middleware --- docs/config/01-configuration-file.md | 8 ++++++ lib/web-server.js | 27 ++++++++++++-------- test/unit/web-server.spec.js | 38 ++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/docs/config/01-configuration-file.md b/docs/config/01-configuration-file.md index 793683d4f..dd8c2c17e 100644 --- a/docs/config/01-configuration-file.md +++ b/docs/config/01-configuration-file.md @@ -459,6 +459,14 @@ mime: { ``` +## beforeMiddleware +**Type:** Array + +**Default:** `[]` + +**Description:** This is the same as middleware except that these middleware will be run before karma's own middleware. + + ## plugins **Type:** Array diff --git a/lib/web-server.js b/lib/web-server.js index 1405032c0..2f5426c29 100644 --- a/lib/web-server.js +++ b/lib/web-server.js @@ -57,16 +57,23 @@ var createWebServer = function (injector, emitter, fileList) { log.debug('Instantiating middleware') var handler = connect() - .use(injector.invoke(runnerMiddleware.create)) - .use(injector.invoke(stopperMiddleware.create)) - .use(injector.invoke(stripHostMiddleware.create)) - .use(injector.invoke(karmaMiddleware.create)) - .use(injector.invoke(sourceFilesMiddleware.create)) - // TODO(vojta): extract the proxy into a plugin - .use(proxyMiddlewareInstance) - // TODO(vojta): remove, this is only here because of karma-dart - // we need a better way of custom handlers - .use(injector.invoke(createCustomHandler)) + + if (config.beforeMiddleware) { + config.beforeMiddleware.forEach(function (middleware) { + handler.use(injector.get('middleware:' + middleware)) + }) + } + + handler.use(injector.invoke(runnerMiddleware.create)) + handler.use(injector.invoke(stopperMiddleware.create)) + handler.use(injector.invoke(stripHostMiddleware.create)) + handler.use(injector.invoke(karmaMiddleware.create)) + handler.use(injector.invoke(sourceFilesMiddleware.create)) + // TODO(vojta): extract the proxy into a plugin + handler.use(proxyMiddlewareInstance) + // TODO(vojta): remove, this is only here because of karma-dart + // we need a better way of custom handlers + handler.use(injector.invoke(createCustomHandler)) if (config.middleware) { config.middleware.forEach(function (middleware) { diff --git a/test/unit/web-server.spec.js b/test/unit/web-server.spec.js index d60f45bfb..8bd120b2a 100644 --- a/test/unit/web-server.spec.js +++ b/test/unit/web-server.spec.js @@ -33,6 +33,7 @@ describe('web-server', () => { // this relies on the fact that none of these tests mutate fs var m = mocks.loadFile(path.join(__dirname, '/../../lib/web-server.js'), _mocks, _globals) var customFileHandlers = server = emitter = null + var beforeMiddlewareActive = false var middlewareActive = false var servedFiles = (files) => { emitter.emit('file_list_modified', {included: [], served: files}) @@ -45,6 +46,7 @@ describe('web-server', () => { var config = { basePath: '/base/path', urlRoot: '/', + beforeMiddleware: ['beforeCustom'], middleware: ['custom'], middlewareResponse: 'hello middleware!', mime: {'custom/custom': ['custom']} @@ -59,6 +61,15 @@ describe('web-server', () => { reporter: ['value', null], executor: ['value', null], proxies: ['value', null], + 'middleware:beforeCustom': ['factory', function (config) { + return function (request, response, next) { + if (beforeMiddlewareActive) { + response.writeHead(223) + return response.end('hello from before middleware!') + } + next() + } + }], 'middleware:custom': ['factory', function (config) { return function (request, response, next) { if (middlewareActive) { @@ -106,12 +117,39 @@ describe('web-server', () => { .expect(200, 'new-js-source') }) + describe('beforeMiddleware', () => { + beforeEach(() => { + servedFiles(new Set([new File('/base/path/one.js')])) + beforeMiddlewareActive = true + }) + + afterEach(() => { + beforeMiddlewareActive = false + }) + + it('should use injected middleware', () => { + return request(server) + .get('/base/other.js') + .expect(223, 'hello from before middleware!') + }) + + it('should inject middleware before served files', () => { + return request(server) + .get('/base/one.js') + .expect(223, 'hello from before middleware!') + }) + }) + describe('middleware', () => { beforeEach(() => { servedFiles(new Set([new File('/base/path/one.js')])) middlewareActive = true }) + afterEach(() => { + middlewareActive = false + }) + it('should use injected middleware', () => { return request(server) .get('/base/other.js')