index.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. var Negotiator = require('negotiator');
  2. var zlib = require('zlib');
  3. var through = require('through');
  4. var responseStream = require('response-stream');
  5. module.exports = function (req) {
  6. var negotiator = new Negotiator(req);
  7. var enc = negotiator.preferredEncodings([ 'gzip', 'compress', 'identity' ]);
  8. if (Array.isArray(enc)) enc = enc[0];
  9. var createStream = {
  10. gzip : zlib.createGzip,
  11. compress : zlib.createDeflate,
  12. identity : through,
  13. }[enc] || through;
  14. var stream = responseStream(createStream());
  15. stream.on('setHeader', function (args, prevent) {
  16. if (String(args[0]).toLowerCase() === 'content-length') {
  17. prevent();
  18. }
  19. });
  20. stream.on('writeHead', function (args, prevent) {
  21. if (!args[0] || typeof args[0] !== 'object') return;
  22. Object.keys(args[1]).forEach(function (key) {
  23. if (String(key).toLowerCase() === 'content-length') {
  24. delete args[0][key];
  25. }
  26. });
  27. });
  28. stream.on('response', function (res) {
  29. if (!res._headers
  30. || res._headers['content-encoding'] === undefined) {
  31. res.setHeader('content-encoding', enc);
  32. }
  33. res.removeHeader('content-length');
  34. });
  35. return stream;
  36. };