Queremos enviar el cuerpo comprimido mediante una solicitud HTTP gzip en chai-http en mocha.
let chai = require('chai'); let chaiHttp = require('chai-http'); const zlib = require('zlib'); chai.use(chaiHttp); object = { "content": { "data": { "key": "testval" } } }; const objStr = JSON.stringify(object); const objBuf = Buffer.from(objStr, "utf-8"); const bodyContent = zlib.gzipSync(objBuf); const bodyLen = Buffer.byteLength(bodyContent, 'utf-8'); chai.request("http://serverurl") .post('/path') .set('Content-Type', 'application/json') .set('Content-Encoding', 'gzip') .set('Content-Length', bodyLen) .set('Accept-Encoding', 'gzip') .send(bodyContent) .end((err, res) => { expect(err).to.be.null; expect(res).to.have.status(200); done(); }); Sin embargo, encontramos el error Error: incorrect header check at Zlib.zlibOnError en el lado del servidor. ¿Hay algo que me estoy perdiendo?
Parece que es superagente, está rompiendo la codificación, porque encadena todo lo que no es una cadena y tiene application/json , entonces en lugar de un Buffer:
<Buffer 1f 8b 08 00 00 00está enviando un JSON:
{"type":"Buffer","data":[31,139,8,0,...rompiendo la codificación, causando el error.
Sucede aquí:
Agregar !Buffer.isBuffer(data) o algo allí podría funcionar.
Hasta entonces, intente una solución alternativa, por ejemplo con http :
const http = require('http') const options = { hostname: 'serverurl', port: 443, path: '/path', method: 'POST', headers: { 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Accept-Encoding': 'gzip', 'Content-Length': bodyLen } }; const req = http.request(options, (res) => { //res.setEncoding('utf8'); //res.on('data', function(chunk) { // console.log('data', chunk); //}); expect(res).to.have.status(200); done(); }); req.on('error', function(e) { console.log('err: ' + e.message); //expect(err).to.be.null; process.exit(); }); req.write(bodyContent); req.end();Pude hacer esta función para superagent anulando la función de serialización cuando application/json está en juego. Si el búfer se identifica como un búfer gzip, déjelo pasar por la serialización sin modificar.
var isgzipBuffer = require('@stdlib/assert-is-gzip-buffer') superagent.serialize['application/json'] = function(...args) { if (isgzipBuffer(args[0]) === false) { return JSON.stringify(...args) } return args[0] }También agregué esto para actualizar la codificación de contenido:
if (isgzipBuffer(bodyParam) === true) { headerParams['Content-Encoding'] = 'gzip' }Esto se hizo en el contexto de un cliente javascript codegen, por lo que la sintaxis exacta para configurar los encabezados puede variar.