-
Notifications
You must be signed in to change notification settings - Fork 35
/
gzip.js
58 lines (48 loc) · 1.57 KB
/
gzip.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
var util = require("util");
var zlib = require("zlib");
var Request = require("./request");
var utils = require("./utils");
/**
* A middleware that gzip encodes the body of the response on the fly if the
* client accepts gzip encoding. The `options` may be any of node's zlib
* options (see http://nodejs.org/api/zlib.html) or any of the following:
*
* - types A regular expression that is used to match the Content-Type
* header to determine if the content is able to be gzip'd or
* not. Defaults to `/text|javascript|json/i`.
*/
module.exports = function (app, options) {
options = options || {};
var typeMatcher;
if (utils.isRegExp(options.types)) {
typeMatcher = options.types;
delete options.types;
} else {
typeMatcher = /text|javascript|json/i;
}
function gzip(env, callback) {
app(env, function (status, headers, body) {
var type = headers["Content-Type"];
if (type && typeMatcher.exec(type)) {
var req = new Request(env);
// Make sure the client accepts gzip encoding first.
if (req.acceptsEncoding("gzip")) {
var gzip = zlib.createGzip(options);
if (typeof body === "string") {
gzip.end(body);
} else {
body.pipe(gzip);
}
if ("Content-Length" in headers) {
delete headers["Content-Length"];
}
headers["Vary"] = "Accept-Encoding";
headers["Content-Encoding"] = "gzip";
body = gzip;
}
}
callback(status, headers, body);
});
}
return gzip;
};