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