| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | var should = require('should'),    needle = require('./../'),    http   = require('http'),    zlib   = require('zlib'),    stream = require('stream'),    port   = 11123,    server;describe('compression', function(){  require.bind(null, 'zlib').should.not.throw()  var jsonData = '{"foo":"bar"}';  describe('when server supports compression', function(){    before(function(){      server = http.createServer(function(req, res) {        var raw = new stream.PassThrough();        var acceptEncoding = req.headers['accept-encoding'];        if (!acceptEncoding) {          acceptEncoding = '';        }        if (acceptEncoding.match(/\bdeflate\b/)) {          res.setHeader('Content-Encoding', 'deflate');          raw.pipe(zlib.createDeflate()).pipe(res);        } else if (acceptEncoding.match(/\bgzip\b/)) {          res.setHeader('Content-Encoding', 'gzip');          raw.pipe(zlib.createGzip()).pipe(res);        } else if (acceptEncoding.match(/\bbr\b/)) {          res.setHeader('Content-Encoding', 'br');          raw.pipe(zlib.createBrotliCompress()).pipe(res);        } else {          raw.pipe(res);        }        res.setHeader('Content-Type', 'application/json')        if (req.headers['with-bad']) {          res.end('foo'); // end, no deflate data        } else {          raw.end(jsonData)        }      })      server.listen(port);    });    after(function(done){      server.close(done);    })    describe('and client requests no compression', function() {      it('should have the body decompressed', function(done){        needle.get('localhost:' + port, function(err, response, body){          should.ifError(err);          body.should.have.property('foo', 'bar');          response.bytes.should.equal(jsonData.length);          done();        })      })    })    describe('and client requests gzip compression', function() {      it('should have the body decompressed', function(done){        needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'gzip'}}, function(err, response, body){          should.ifError(err);          body.should.have.property('foo', 'bar');          response.bytes.should.not.equal(jsonData.length);          done();        })      })    })    describe('and client requests deflate compression', function() {      it('should have the body decompressed', function(done){        needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'deflate'}}, function(err, response, body){          should.ifError(err);          body.should.have.property('foo', 'bar');          response.bytes.should.not.equal(jsonData.length);          done();        })      })      it('should rethrow errors from decompressors', function(done){        needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'deflate', 'With-Bad': 'true'}}, function(err, response, body) {          should.exist(err);          err.message.should.equal("incorrect header check");          err.code.should.equal("Z_DATA_ERROR")          done();        })      })    })    describe('and client requests brotli compression', function() {      it('should have the body decompressed', function(done){        // Skip this test if Brotli is not supported        if (typeof zlib.BrotliDecompress !== 'function') {          return done();        }        needle.get('localhost:' + port, {headers: {'Accept-Encoding': 'br'}}, function(err, response, body){          should.ifError(err);          body.should.have.property('foo', 'bar');          response.bytes.should.not.equal(jsonData.length);          done();        })      })    })  })})
 |