Skip to content

Commit da1930f

Browse files
committed
fix(web-server): Allow karma to run in project which path contains HTML URL encoded characters. Karma fails on Jenkins when it checks out branches containing '/' as it converts it to '%2F'. Fixes errors seen on #1751, #61.
1 parent e5d792d commit da1930f

2 files changed

Lines changed: 32 additions & 6 deletions

File tree

lib/middleware/source_files.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,20 @@ var findByPath = function (files, path) {
1313
})
1414
}
1515

16+
var composeUrl = function (url, basePath, urlRoot, mustEscape) {
17+
return (mustEscape ? querystring.unescape(url) : url)
18+
.replace(urlRoot, '/')
19+
.replace(/\?.*$/, '')
20+
.replace(/^\/absolute/, '')
21+
.replace(/^\/base/, basePath)
22+
}
23+
1624
// Source Files middleware is responsible for serving all the source files under the test.
1725
var createSourceFilesMiddleware = function (filesPromise, serveFile, basePath, urlRoot) {
1826
return function (request, response, next) {
19-
var requestedFilePath = querystring.unescape(request.url)
20-
.replace(urlRoot, '/')
21-
.replace(/\?.*$/, '')
22-
.replace(/^\/absolute/, '')
23-
.replace(/^\/base/, basePath)
27+
var requestedFilePath = composeUrl(request.url, basePath, urlRoot, true)
28+
// When a path contains HTML-encoded characters (e.g %2F used by Jenkins for branches with /)
29+
var requestedFilePathUnescaped = composeUrl(request.url, basePath, urlRoot, false)
2430

2531
request.pause()
2632

@@ -29,7 +35,8 @@ var createSourceFilesMiddleware = function (filesPromise, serveFile, basePath, u
2935

3036
return filesPromise.then(function (files) {
3137
// TODO(vojta): change served to be a map rather then an array
32-
var file = findByPath(files.served, requestedFilePath)
38+
var file = findByPath(files.served, requestedFilePath) ||
39+
findByPath(files.served, requestedFilePathUnescaped)
3340
var rangeHeader = request.headers['range']
3441

3542
if (file) {

test/unit/middleware/source_files.spec.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ describe('middleware.source_files', function () {
2323
},
2424
'utf8ášč': {
2525
'some.js': mocks.fs.file(0, 'utf8-file')
26+
},
27+
'jenkins%2Fbranch': {
28+
'some.js': mocks.fs.file(0, 'utf8-file')
2629
}
2730
})
2831

@@ -209,6 +212,22 @@ describe('middleware.source_files', function () {
209212
)
210213
})
211214

215+
it('should serve js source file from paths containing HTML URL encoded chars', function () {
216+
servedFiles([
217+
new File('/jenkins%2Fbranch/some.js')
218+
])
219+
220+
server = createServer(files, serveFile, '')
221+
222+
return request(server)
223+
.get('/base/jenkins%2Fbranch/some.js')
224+
.expect(200, 'utf8-file')
225+
.then(function () {
226+
return expect(next).not.to.have.been.called
227+
}
228+
)
229+
})
230+
212231
it('should set content-type headers', function () {
213232
servedFiles([
214233
new File('/base/path/index.html')

0 commit comments

Comments
 (0)