113 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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();
 | |
|         })
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| })
 |