Как правильно отправлять и получать дефлированные данные

Я использую protobufs для сериализации моих данных. До сих пор я сериализировал свои данные на сервере (узел restify), отправлял их, получал их (запрос сделан XMLHttpRequest) и сериализировал их на клиенте.

Теперь я хочу использовать архивирование, чтобы уменьшить размер передаваемого файла. Я попытался использовать библиотеку pako, которая использует zlib.

В базовом сценарии, который я использовал для сравнения производительности protobuf и zip с json, я использовал его таким образом, и проблем не было

var buffer = proto.encode(data,'MyType'); // Own library on top of protobufs
var output = pako.deflate(buffer);
var unpacked = pako.inflate(output);
var decoded = proto.decode(buffer,'MyType');

Однако, если я пытаюсь сделать это в модели клиент-сервер, я не могу заставить ее работать.

Сервер:

server.get('/data', function (req, res) {
   const data = getMyData();
   const buffer = proto.encode(data, 'MyType');
   res.setHeader('content-type', 'application/octet-stream;');
   res.setHeader('Content-Encoding', 'gzip;');
   return res.send(200,buffer);
});

Мой собственный protoБиблиотека сериализует данные в protobuf и затем дефлирует их:

...
let buffer = type.encode(message).finish();
buffer = pako.deflate(buffer);
return buffer;

Запрос выглядит так:

public getData(){
    return new Promise((resolve,reject) => {
        const request = new XMLHttpRequest();
        request.open("GET", this.url, true);
        request.responseType = "arraybuffer";
        request.onload = function(evt) {
            const arr = new Uint8Array(request.response);
            const payload = proto.decode(request.response ,'MyType')
            resolve(payload);
        };
        request.send();
    });
}

Метод proto.decode сначала надувает буфер buffer = pako.inflate(buffer); а затем десериализует его из Protobuf.

Если запрос сделан, я получаю следующую ошибку: "Uncaught неправильная проверка заголовка", возвращаемая методом inflate pako:

function inflate(input, options) {
  var inflator = new Inflate(options);

  inflator.push(input, true);

  // That will never happens, if you don't cheat with options :)
  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }

  return inflator.result;
}

Также я посмотрел на запрос в Почтальоне и обнаружил следующее: Дефлированный ответ выглядит так: 120,156,60,221,119,64,21,237,119,39,240,247,246,242,10,49,191,244,178,73,54,157 и имеет длину 378564

Тот же запрос без дефлятирования (protobuf) выглядит так �:�: (� 0�8@H (� 0�8@H � (�0�8@�Hи имеет длину 272613.

Я предполагаю, что я делаю что-то неправильно на стороне сервера, так как завышенный запрос больше, чем тот, который не использует сжатие. Это заголовок типа контента? У меня нет идей.

0 ответов

Другие вопросы по тегам