/
forcecharset.js
74 lines (59 loc) · 1.73 KB
/
forcecharset.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
'use strict';
const encodinglib = require('encoding');
const onHeaders = require('on-headers');
module.exports = function(req, res, next) {
// proxy
let write = res.write;
let end = res.end;
let buffer;
let bufferLen;
res.write = (chunk, encoding) => {
if (!chunk || !chunk.length) {
return true;
}
if (!buffer && !/^utf[-_]?8$/i.test(res.forceCharset)) {
buffer = [];
bufferLen = 0;
}
if (!buffer) {
write.call(res, chunk, encoding);
} else {
if (typeof chunk === 'string') {
chunk = Buffer.from(chunk, encoding || 'utf-8');
}
buffer.push(chunk);
bufferLen += chunk.length;
}
return true;
};
res.end = (chunk, encoding) => {
if (chunk) {
res.write(chunk, encoding);
}
if (buffer) {
let buf = bufferLen ? Buffer.concat(buffer, bufferLen) : Buffer.from(0);
let out = encodinglib.convert(buf, res.forceCharset);
res.setHeader('Content-Length', out.length);
if (res.forceCharset) {
let type = res
.getHeader('content-type')
.split(';')
.shift();
res.setHeader('content-type', type + '; charset=' + res.forceCharset);
}
write.call(res, out, 'buffer');
}
return end.call(res);
};
onHeaders(res, () => {
// head
if (req.method === 'HEAD') {
return;
}
if (!/^utf[-_]?8$/i.test(res.forceCharset)) {
buffer = [];
bufferLen = 0;
}
});
next();
};