Я пытаюсь декодировать ответ gzip с сервера, который представляет собой массив msgpack или массив msgpack, который, наконец, gzipped.
, чтобы проиллюстрировать это, мой ответ выглядит примерно так:
gzip(msgpack([msgpack([]), msgpack([]), msgpack([]) ....]))
это то, что я сделал до сих пор, но я получаю сообщение об ошибке msgpack
msgpack: invalid code=3f decoding array length
и, следовательно, все, что я получаю, это пустые кусочки.
эта функция getBytes у меня естьвзято из этого SO ответа
func getBytes(key interface{}) ([]byte, error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
err := enc.Encode(key)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
var unZipped io.Reader
unZipped, err = gzip.NewReader(resp.Body)
var dataBytes bytes.Buffer
_, err = dataBytes.ReadFrom(unZipped)
if err != nil {
logger.Println("error un gzipping", err)
}
var packedSlices []interface{}
bytesSlice := dataBytes.Bytes()
err = msgpack.Unmarshal(bytesSlice, &packedSlices)
for _, c := range packedSlices {
var packedSlice []interface{}
byts, _ := getBytes(c)
err = msgpack.Unmarshal(byts, &packedSlice)
logger.Println(err, packedSlice)
}
Когда я делаю то же самое в Python 3.7, он работает нормально:
resp = requests.post(url, headers=headers, json=payload, stream=True)
datas = msgpack.loads(gzip.decompress(resp.raw.data))
datas = [msgpack.loads(k) for k in datas]
Есть что-то, что я здесь упускаю??