• Как получить исходный ответ сайта в нужной кодировке?

    @EDiPensier Автор вопроса
    SANTA2112, конкретно подразумевающуюся не могу, по причине того, что там закрытый доступ.
    Однако из свободно индексирующихся со схожей проблемой, думаю вот эта вполне подойдёт. Те же самые признаки, только Content-Encoding - gzip, вместо br.
  • Как получить исходный ответ сайта в нужной кодировке?

    @EDiPensier Автор вопроса
    Антон Шаманов, input на входе в cli - это имя файла, к которому была применена компрессия. Далее же идёт считывание посредством fs.readFileSync, что возвращает буфер, который идёт в Uint8Array, а потом в BrotliDecode.
    У меня сразу идёт буфер из хекса, который по utf-8 равняется " ХОÐДРЦИВИК " , вот в чём банальное различие.
    В любом случае идёт ступор при вызове основной функции BrotliDecode , что скорее говорит о том, что к этому буферу не применим такой подход, ибо раскодировка по br скорее всего была уже произведена до получения буфера, который у меня уже имеется.
  • Как получить исходный ответ сайта в нужной кодировке?

    @EDiPensier Автор вопроса
    Антон Шаманов, как раз и по cli составлял код выше.

    fs.readFileSync - возвращает буфер, который заменён на получение буфера, который приходит мне (сохраняю в хекс).

    const bytes = new Uint8Array(data);

    Из буфера в Uint8Array (в тестах также присутствует Int8Array, который кстати работает без проблем)

    Подключение decode.min.js содержит длинный код, не стал скидывать, но основываясь на успешную конвертацию Int8Array теста, который до этого прогонял - подключено верно.

    Собственно вызов самой функции конвертации, там в цикле, у меня один раз.

    И запись в новый буфер через new Buffer, который равносилен Buffer.from .

    Итого - ступор в бесконечном цикле при вызове:
    const result = BrotliDecode(bytes);
  • Как получить исходный ответ сайта в нужной кодировке?

    @EDiPensier Автор вопроса
    Антон Шаманов, из README:
    JavaScript port of brotli decoder. Could be used directly via npm install brotli
    - то есть, порт приведённой ссылки, который я пытался использовать.
    Но также и располагающееся содержимое ( google/brotli/blob/master/js/decode.min.js ) поставил и попробовал таким образом:
    const hex = `c390c2a5c390c5bec390c29dc390e2809dc390c29020c390c2a6c390cb9cc390e28099c390cb9cc390c5a1`;
    const buffer = Buffer.from(hex, "hex");
    
    //const bytes = new Uint8Array(buffer);
    const bytes = new Int8Array(buffer);
    
    const result = BrotliDecode(bytes);
    
    console.log( Buffer.from(result).toString() );

    На моменте с вызовом BrotliDecode впадает в бесконечный цикл и не проходит дальше.

    Порт же:
    const hex = `c390c2a5c390c5bec390c29dc390e2809dc390c29020c390c2a6c390cb9cc390e28099c390cb9cc390c5a1`;
    const buffer = Buffer.from(hex, "hex");
    
    console.log(brotli.decompress(buffer));

    Падает с
    ошибкой
    Error: [CopyUncompressedBlockToOutput] not enough bytes
    at CopyUncompressedBlockToOutput
    at BrotliDecompress
    at Object.BrotliDecompressBuffer
  • Как получить исходный ответ сайта в нужной кодировке?

    @EDiPensier Автор вопроса
    То есть мне следует буфер, полученный из:
    (await response.buffer()).toString("hex") //c390c2a5c390c5bec390c29dc390e2809dc390c29020c390c2a6c390cb9cc390e28099c390cb9cc390c5a1

    декомпрессировать через подручные средства nodejs?
    Собственно, zlib.brotliDecompress и npm brotli выдают ошибки.
    Мне кажется, что к буферу, который получается вышеупомянутым образом, уже применена декомпрессация.
    Я покопался в исходниках puppeteer и обнаружил, что конструкция ссылается на Chrome Devtools Protocol -> Network.getResponseBody , который возвращает уже строку и логическое значение - закодировано ли это в base64, а сама обёртка возвращает буфер по такой логике:
    return Buffer.from(
        response.body,
        response.base64Encoded ? 'base64' : 'utf8'
    );

    Не поленился вызвать без буферной обёртки и получил объект, где строка закодирована в предполагаемом windows-1252...