Skip to content

Commit cf17c2f

Browse files
authored
Merge pull request #736 from boarwell/encoding-charset
Add encoding charset sniffing
2 parents 1e89681 + b0cb863 commit cf17c2f

File tree

6 files changed

+525
-21
lines changed

6 files changed

+525
-21
lines changed

lib/core/index.js

+18-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
const path = require('path');
66
const fs = require('fs');
77
const url = require('url');
8+
const { Readable } = require('stream');
9+
const buffer = require('buffer');
810
const mime = require('mime');
911
const urlJoin = require('url-join');
1012
const showDir = require('./show-dir');
1113
const version = require('../../package.json').version;
1214
const status = require('./status-handlers');
1315
const generateEtag = require('./etag');
1416
const optsParser = require('./opts');
17+
const htmlEncodingSniffer = require('html-encoding-sniffer');
1518

1619
let httpServerCore = null;
1720

@@ -234,8 +237,17 @@ module.exports = function createMiddleware(_dir, _options) {
234237
let cacheControl = cache;
235238
let stream = null;
236239
if (contentType && isTextFile(contentType)) {
237-
// Assume text types are utf8
238-
contentType += '; charset=UTF-8';
240+
if (stat.size < buffer.constants.MAX_LENGTH) {
241+
const bytes = fs.readFileSync(file);
242+
const sniffedEncoding = htmlEncodingSniffer(bytes, {
243+
defaultEncoding: 'UTF-8'
244+
});
245+
contentType += `; charset=${sniffedEncoding}`;
246+
stream = Readable.from(bytes)
247+
} else {
248+
// Assume text types are utf8
249+
contentType += '; charset=UTF-8';
250+
}
239251
}
240252

241253
if (file === gzippedFile) { // is .gz picked up
@@ -317,7 +329,10 @@ module.exports = function createMiddleware(_dir, _options) {
317329
return;
318330
}
319331

320-
stream = fs.createReadStream(file);
332+
// stream may already have been assigned during encoding sniffing.
333+
if (stream === null) {
334+
stream = fs.createReadStream(file);
335+
}
321336

322337
stream.pipe(res);
323338
stream.on('error', (err) => {

0 commit comments

Comments
 (0)