Невозможно получить, написать и прочитать файл шрифта, используя nodejs

Проблема:

Файл, загруженный с помощью модуля запроса и записанный в файловую систему, отличается от файла, загруженного непосредственно с помощью браузера.

Я получаю файл шрифта, расположенный по адресу https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff, Есть следующие 3 случая.

Случай 1

Теперь, когда обычно веб-сайт запускает этот URL из своего исходного кода, следующий ответ [как проверено в инструментах deveoper]

d09GRgABAAAAAPqMABMAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN....

и когда я получаю его, используя мой скрипт nodejs, я получаю ответ

Woff....??....4(...2....

Выше был ответ, который я видел во вкладке сети инструментов разработчика браузера.

Дело 2

Но когда я запускаю оба URL, то есть оригинал и мой собственный http://<host>/_oe/https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woffв Почтальон, я получаю такой же ответ.

Дело 3

Затем снова, когда скопировать и вставить https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff в загрузчике файл, который загружается, читается как

774f 4646 0001 0000 0000 c7f4 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 4f53 2f32

и файл, который записывается с использованием моего сценария nodejs, читается как

774f 4646 0001 0000 0000 efbf bdef bfbd 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Оба снова разные.

Вопрос

Мой вопрос: может ли кто-нибудь объяснить, что здесь происходит, что я делаю неправильно, и что я могу сделать, чтобы получить правильный файл шрифта с правильной кодировкой, чтобы он правильно использовался на веб-интерфейсе.

Скрипт Nodejs: вот мой код nodejs

app.get('/*', (req, res) => {
    var extension = '.woff';
    var options         = {
        headers: {
            'connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Accept-Language': 'en-US,en;q=0.5'
        },
        url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff'
    };

    sendRequest(options, extension, function(headers){

        //setting response headers
        var header_ = {};
        for(var attribute in  headers){
            if(attribute !== 'content-length'){
                header_[attribute] = headers[attribute];
            }
        }

        //#================================================================
        res.writeHead(200, header_);
        var filePath = path.join(__dirname, 'output/temp'+extension);
            var stat = fileSystem.statSync(filePath);
            var readStream = fileSystem.createReadStream(filePath);
            //read from `readStream` write to `res`
            readStream.pipe(res);
        //#================================================================

    });

})

async function sendRequest(options, extension, callback){
    var headers;
    request(options, function(error, response, body){
        if (!error && response.statusCode == 200) {
            headers = response.headers;

            if (String(response.headers['content-type']).indexOf('text/html') !== -1){
                // any manipulation related to the html file                
            }else {
                // where I get my font url response
                fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, function(err) {
                    if(err) {
                        return console.log(err);
                    }
                    callback(headers);
                }); 
            }
        }
    });
}

app.listen(3000, () => console.log('Example app listening on port 3000!'));

ОБНОВИТЬ

Я даже использовал "двоичный" вариант при записи файла, т.е.

fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, "binary", function(err) {})

Теперь на консоли я получаю данные в нужном форматеd09GRgABAAAAAP39AAs...

но все же отличается от того, что я получаю с оригинального сайта, т.е.d09GRgABAAAAAPqMABMAAAACNC...

1 ответ

Решение

Чтобы получить необработанный буфер для ответа, вам необходимо установить encoding в null

var options = {
    url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff',
    encoding : null
};

Если вы затем запишите это в файл:

request(options, function(error, response, body) {
    fs.writeFile('test.woff', body, function(err) {

    })
})

Тогда это будет эквивалентно тому, что вы просили.

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