0x01. Sobre
Ao escrever HTTP, o código Gleded aparece ao receber solicitações HTTP. Mais tarde, descobri que o GZIP não é descomprimido.
Em relação à compactação GZIP/deflate, existem métodos para colocar compressão de tubo e compactação sem tubos.
0x02.pipe Compressão
A E/S no nó é assíncrona; portanto, ler e escrever para disco e rede requer leitura e gravação para dados por meio de funções de retorno de chamada.
Quando os dados que precisam ser processados não podem ser carregados na memória ao mesmo tempo ou quando o processamento é mais eficiente durante a leitura, precisamos usar fluxos de dados.
O NodeJS fornece operações nos fluxos de dados através de vários fluxos.
O site oficial fornece métodos de pipeline:
A cópia do código é a seguinte:
// Exemplo de solicitação do cliente
var zlib = requer ('zlib');
var http = requer ('http');
var fs = requer ('fs');
var request = http.get ({host: 'homeway.me',
caminho: '/',
Porta: 80,
Cabeçalhos: {'aceitar-se-codificação': 'gzip, deflate'}});
request.on ('resposta', função (resposta) {
var output = fs.createwritestream ('izs.me_index.html');
Switch (Response.Headers ['Content-Encoding']) {
// ou, basta usar o zlib.createunzip () para lidar com os dois casos
caso 'gzip':
Response.pipe (zlib.createGunzip ()). tubo (saída);
quebrar;
caso 'deflate':
Response.pipe (zlib.createInflate ()). tubo (saída);
quebrar;
padrão:
resposta.pipe (saída);
quebrar;
}
});
0x03. Compactação sem tubo
O código é o seguinte:
A cópia do código é a seguinte:
#! /usr/local/bin/nó
var http = requer ('http'),
querystring = requer ('querystring'),
zlib = requer ('zlib');
var args = {
// parâmetros e dados de backup
Conteúdo: Querystring.Stringify ({
// Informações sobre contratação
Nome: 'homeway.me',
}),
};
var options = {
HostName: 'homeway.me',
Porta: 80,
caminho: '/',
Método: 'Get',
Cabeçalhos: {
'Aceitar': 'texto/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0.9, imagem/webp,*/*; q = 0,8',
'Length-comprimento': args.contents.length,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) Applewebkit/537.36 (KHTML, como Gecko) Chrome/42.0.2311.11 Safari/537.36',
'Acepto-codificação': 'gzip, deflate',
},
};
var get = function (opções, args, retorno de chamada) {
var req = http.request (opções, função (res) {
var chunks = [], dados, coding = res.headers ['content-codinging'];
// não-gzip/deflate deve ser convertido em formato UTF-8
if (codinging === 'indefinido') {
res.setEncoding ('UTF-8');
}
res.on ('dados', função (chunk) {
pedaços.push (pedaço);
});
res.on ('end', function () {
var buffer = buffer.concat (pedaços);
if (codinging == 'gzip') {
zlib.gunzip (buffer, função (err, decodificado) {
dados = decodificado.toString ();
retorno de chamada (err, args, res.headers, dados);
});
} else if (coding == 'deflate') {
zlib.inflate (buffer, função (err, decodificado) {
dados = decodificado.toString ();
retorno de chamada (err, args, res.headers, dados);
});
} outro {
dados = buffer.toString ();
retorno de chamada (null, args, res.headers, dados);
}
});
});
req.write (args.contents);
req.end ();
};
get (opções, args, função (err, args, cabeçalhos, dados) {
console.log ('==> cabeçalho /n', cabeçalhos);
console.log ('== dados /n', dados);
});
O exposto acima é todo o NodeJS sobre a compactação GZIP/deflate. Espero que todos gostem.