Skip to content

Commit 51b4206

Browse files
committed
feat: adding support for before middleware
1 parent ca95553 commit 51b4206

3 files changed

Lines changed: 63 additions & 10 deletions

File tree

docs/config/01-configuration-file.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,14 @@ mime: {
459459
```
460460

461461

462+
## beforeMiddleware
463+
**Type:** Array
464+
465+
**Default:** `[]`
466+
467+
**Description:** This is the same as middleware except that these middleware will be run before karma's own middleware.
468+
469+
462470
## plugins
463471
**Type:** Array
464472

lib/web-server.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,23 @@ var createWebServer = function (injector, emitter, fileList) {
5757

5858
log.debug('Instantiating middleware')
5959
var handler = connect()
60-
.use(injector.invoke(runnerMiddleware.create))
61-
.use(injector.invoke(stopperMiddleware.create))
62-
.use(injector.invoke(stripHostMiddleware.create))
63-
.use(injector.invoke(karmaMiddleware.create))
64-
.use(injector.invoke(sourceFilesMiddleware.create))
65-
// TODO(vojta): extract the proxy into a plugin
66-
.use(proxyMiddlewareInstance)
67-
// TODO(vojta): remove, this is only here because of karma-dart
68-
// we need a better way of custom handlers
69-
.use(injector.invoke(createCustomHandler))
60+
61+
if (config.beforeMiddleware) {
62+
config.beforeMiddleware.forEach(function (middleware) {
63+
handler.use(injector.get('middleware:' + middleware))
64+
})
65+
}
66+
67+
handler.use(injector.invoke(runnerMiddleware.create))
68+
handler.use(injector.invoke(stopperMiddleware.create))
69+
handler.use(injector.invoke(stripHostMiddleware.create))
70+
handler.use(injector.invoke(karmaMiddleware.create))
71+
handler.use(injector.invoke(sourceFilesMiddleware.create))
72+
// TODO(vojta): extract the proxy into a plugin
73+
handler.use(proxyMiddlewareInstance)
74+
// TODO(vojta): remove, this is only here because of karma-dart
75+
// we need a better way of custom handlers
76+
handler.use(injector.invoke(createCustomHandler))
7077

7178
if (config.middleware) {
7279
config.middleware.forEach(function (middleware) {

test/unit/web-server.spec.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('web-server', () => {
3333
// this relies on the fact that none of these tests mutate fs
3434
var m = mocks.loadFile(path.join(__dirname, '/../../lib/web-server.js'), _mocks, _globals)
3535
var customFileHandlers = server = emitter = null
36+
var beforeMiddlewareActive = false
3637
var middlewareActive = false
3738
var servedFiles = (files) => {
3839
emitter.emit('file_list_modified', {included: [], served: files})
@@ -45,6 +46,7 @@ describe('web-server', () => {
4546
var config = {
4647
basePath: '/base/path',
4748
urlRoot: '/',
49+
beforeMiddleware: ['beforeCustom'],
4850
middleware: ['custom'],
4951
middlewareResponse: 'hello middleware!',
5052
mime: {'custom/custom': ['custom']}
@@ -59,6 +61,15 @@ describe('web-server', () => {
5961
reporter: ['value', null],
6062
executor: ['value', null],
6163
proxies: ['value', null],
64+
'middleware:beforeCustom': ['factory', function (config) {
65+
return function (request, response, next) {
66+
if (beforeMiddlewareActive) {
67+
response.writeHead(223)
68+
return response.end('hello from before middleware!')
69+
}
70+
next()
71+
}
72+
}],
6273
'middleware:custom': ['factory', function (config) {
6374
return function (request, response, next) {
6475
if (middlewareActive) {
@@ -106,12 +117,39 @@ describe('web-server', () => {
106117
.expect(200, 'new-js-source')
107118
})
108119

120+
describe('beforeMiddleware', () => {
121+
beforeEach(() => {
122+
servedFiles(new Set([new File('/base/path/one.js')]))
123+
beforeMiddlewareActive = true
124+
})
125+
126+
afterEach(() => {
127+
beforeMiddlewareActive = false
128+
})
129+
130+
it('should use injected middleware', () => {
131+
return request(server)
132+
.get('/base/other.js')
133+
.expect(223, 'hello from before middleware!')
134+
})
135+
136+
it('should inject middleware before served files', () => {
137+
return request(server)
138+
.get('/base/one.js')
139+
.expect(223, 'hello from before middleware!')
140+
})
141+
})
142+
109143
describe('middleware', () => {
110144
beforeEach(() => {
111145
servedFiles(new Set([new File('/base/path/one.js')]))
112146
middlewareActive = true
113147
})
114148

149+
afterEach(() => {
150+
middlewareActive = false
151+
})
152+
115153
it('should use injected middleware', () => {
116154
return request(server)
117155
.get('/base/other.js')

0 commit comments

Comments
 (0)