mirror of
https://github.com/strapi/strapi.git
synced 2025-11-14 09:07:59 +00:00
263 lines
7.1 KiB
JavaScript
263 lines
7.1 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
|
|
const should = require('should');
|
|
const request = require('supertest');
|
|
|
|
const assert = require('assert');
|
|
const http = require('http');
|
|
const Stream = require('stream');
|
|
const crypto = require('crypto');
|
|
const path = require('path');
|
|
|
|
const strapi = require('../../..');
|
|
const Koa = strapi.server;
|
|
|
|
describe('compress', function() {
|
|
|
|
describe('strapi.middlewares.compress()', function() {
|
|
it('should work with no options', function() {
|
|
strapi.middlewares.compress();
|
|
});
|
|
});
|
|
|
|
const buffer = crypto.randomBytes(1024);
|
|
const string = buffer.toString('hex');
|
|
|
|
function* sendString(next) {
|
|
this.body = string
|
|
}
|
|
|
|
function* sendBuffer(next) {
|
|
this.compress = true;
|
|
this.body = buffer
|
|
}
|
|
|
|
it('should compress strings', function(done) {
|
|
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendString);
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err) return done(err);
|
|
|
|
//res.should.have.header('Content-Encoding', 'gzip')
|
|
res.should.have.header('Transfer-Encoding', 'chunked');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-length');
|
|
res.text.should.equal(string);
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should not compress strings below threshold', function(done) {
|
|
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress({
|
|
threshold: '1mb'
|
|
}));
|
|
app.use(sendString);
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err) return done(err);
|
|
|
|
res.should.have.header('Content-Length', '2048');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-encoding');
|
|
res.headers.should.not.have.property('transfer-encoding');
|
|
res.text.should.equal(string);
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should compress JSON body', function(done) {
|
|
var jsonBody = {
|
|
'status': 200,
|
|
'message': 'ok',
|
|
'data': string
|
|
};
|
|
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(function*(next) {
|
|
this.body = jsonBody
|
|
});
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
res.should.have.header('Transfer-Encoding', 'chunked');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-length');
|
|
res.text.should.equal(JSON.stringify(jsonBody));
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should not compress JSON body below threshold', function(done) {
|
|
var jsonBody = {
|
|
'status': 200,
|
|
'message': 'ok'
|
|
};
|
|
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(function* sendJSON(next) {
|
|
this.body = jsonBody
|
|
});
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-encoding');
|
|
res.headers.should.not.have.property('transfer-encoding');
|
|
res.text.should.equal(JSON.stringify(jsonBody));
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should compress buffers', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendBuffer);
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
//res.should.have.header('Content-Encoding', 'gzip')
|
|
res.should.have.header('Transfer-Encoding', 'chunked');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-length');
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should compress streams', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
|
|
app.use(function*(next) {
|
|
this.type = 'application/javascript';
|
|
this.body = fs.createReadStream(path.join(__dirname, 'index.js'))
|
|
});
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
//res.should.have.header('Content-Encoding', 'gzip')
|
|
res.should.have.header('Transfer-Encoding', 'chunked');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-length');
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should compress when this.compress === true', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendBuffer);
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
//res.should.have.header('Content-Encoding', 'gzip')
|
|
res.should.have.header('Transfer-Encoding', 'chunked');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-length');
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should not compress when this.compress === false', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(function*(next) {
|
|
this.compress = false;
|
|
this.body = buffer
|
|
});
|
|
|
|
request(app.listen()).get('/').expect(200).end(function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
res.should.have.header('Content-Length', '1024');
|
|
res.should.have.header('Vary', 'Accept-Encoding');
|
|
res.headers.should.not.have.property('content-encoding');
|
|
res.headers.should.not.have.property('transfer-encoding');
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should not compress HEAD requests', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendString);
|
|
|
|
request(app.listen()).head('/').expect(200).expect('', function(err, res) {
|
|
if (err)
|
|
return done(err);
|
|
|
|
res.headers.should.not.have.property('content-encoding');
|
|
|
|
done()
|
|
})
|
|
});
|
|
|
|
it('should not crash even if accept-encoding: sdch', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendBuffer);
|
|
|
|
request(app.listen()).get('/').set('Accept-Encoding', 'sdch, gzip, deflate').expect(200, done)
|
|
});
|
|
|
|
it('should not crash if no accept-encoding is sent', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(sendBuffer);
|
|
|
|
request(app.listen()).get('/').expect(200, done)
|
|
});
|
|
|
|
it('should not crash if a type does not pass the filter', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress());
|
|
app.use(function*() {
|
|
this.type = 'image/png';
|
|
this.body = new Buffer(2048)
|
|
});
|
|
|
|
request(app.listen()).get('/').expect(200, done)
|
|
});
|
|
|
|
it('should not compress when transfer-encoding is already set', function(done) {
|
|
let app = strapi.server();
|
|
app.use(strapi.middlewares.compress({
|
|
threshold: 0
|
|
}));
|
|
app.use(function*() {
|
|
this.set('Content-Encoding', 'identity');
|
|
this.type = 'text';
|
|
this.body = 'asdf'
|
|
});
|
|
|
|
request(app.listen()).get('/').expect('asdf', done)
|
|
});
|
|
});
|