Skip to content

Commit 452e0d1

Browse files
committed
Support for static files with arbitrary mimetypes
Includes static binary files, and audio/video files that require range support
1 parent 7da77f8 commit 452e0d1

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

lib/server.js

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,9 @@ var Log = require('./logger'),
88
utils = require('./utils'),
99
config = require('../lib/config'),
1010
proxyServer = require('./proxy').proxyServer,
11-
chalk = require('chalk');
12-
13-
var mimeTypes = {
14-
'html': 'text/html',
15-
'json': 'text/json',
16-
'jpeg': 'image/jpeg',
17-
'jpg': 'image/jpeg',
18-
'png': 'image/png',
19-
'js': 'text/javascript',
20-
'css': 'text/css'
21-
};
11+
chalk = require('chalk'),
12+
mime = require('mime'),
13+
send = require('send');
2214

2315

2416
exports.Server = function Server(bsClient, workers) {
@@ -37,7 +29,7 @@ exports.Server = function Server(bsClient, workers) {
3729
worker.markAckd();
3830
}
3931

40-
var getReporterPatch = function (mimeType) {
32+
var getReporterPatch = function () {
4133
var scripts = [
4234
'json2.js',
4335
'browserstack.js',
@@ -53,7 +45,7 @@ exports.Server = function Server(bsClient, workers) {
5345
var filePath = path.relative(process.cwd(), filename);
5446
var pathMatches = (testFilePaths.indexOf(filePath) !== -1);
5547

56-
if (pathMatches && mimeType === 'text/html') {
48+
if (pathMatches) {
5749
var framework = config['test_framework'];
5850
var tag_name = (framework === 'mocha') ? 'head' : 'body';
5951
var patch = '$1';
@@ -98,13 +90,12 @@ exports.Server = function Server(bsClient, workers) {
9890
return;
9991
}
10092

101-
var mimeType = mimeTypes[path.extname(filename).split('.')[1]];
10293
response.writeHead(200, {
103-
'Content-Type': mimeType + '; charset=utf-8',
94+
'Content-Type': 'text/html; charset=utf-8'
10495
});
10596
var tag_name = (config['test_framework'] === 'mocha') ? 'head' : 'body';
10697
var matcher = new RegExp('(.*)<\/' + tag_name + '>'); ///(.*)<\/body>/;
107-
var patch = getReporterPatch(mimeType);
98+
var patch = getReporterPatch();
10899
data = data.replace(matcher, patch);
109100

110101
response.write(data);
@@ -113,12 +104,12 @@ exports.Server = function Server(bsClient, workers) {
113104

114105
if (!doNotUseProxy && config.test_server) {
115106
proxyServer.onRequest(request, response, config.test_server, function(remote_response, response_data) {
116-
var mimeType = mimeTypes[path.extname(filename).split('.')[1]];
107+
var mimeType = mime.lookup(filename);
117108
var final_data = response_data;
118109
var headers = remote_response.headers;
119110
if (mimeType === 'text/html') {
120111
var matcher = /(.*)<\/head>/;
121-
var patch = getReporterPatch(mimeType);
112+
var patch = getReporterPatch();
122113
final_data = response_data.replace(matcher, patch);
123114
headers['content-length'] = final_data.length;
124115
}
@@ -144,7 +135,19 @@ exports.Server = function Server(bsClient, workers) {
144135
filename = filename + (filename.lastIndexOf('/') === filename.length - 1 ? '' : '/') + 'index.html';
145136
}
146137

147-
fs.readFile(filename, {encoding: 'utf8'}, writeResponse);
138+
var mimeType = mime.lookup(filename);
139+
if (mimeType === 'text/html') {
140+
fs.readFile(filename, { encoding: 'utf8' }, function (err, data) {
141+
writeResponse(err, data);
142+
});
143+
} else {
144+
send(request, filename)
145+
.on('error', function onSendError(err) {
146+
response.statusCode = err.status || 500;
147+
response.end(err.message || 'Internal Server Error');
148+
})
149+
.pipe(response);
150+
}
148151
});
149152
}
150153
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
"dependencies": {
1111
"browserstack": "1.1.0",
1212
"chalk": "0.4.0",
13+
"mime": "1.3.4",
14+
"send": "0.13.0",
1315
"tunnel": "0.0.3"
1416
},
1517
"devDependencies": {

0 commit comments

Comments
 (0)