0x01. À propos
Lors de l'écriture de HTTP, le code brouillé apparaît lors de la réception des demandes HTTP. Plus tard, j'ai trouvé que GZIP n'est pas décompressé.
En ce qui concerne la compression GZIP / dégonflage, il existe des méthodes de compression de tuyaux et de compression non pipe.
0x02. Compression de tuyaux
Les E / S dans le nœud sont asynchrones, donc la lecture et l'écriture sur le disque et le réseau nécessitent la lecture et l'écriture sur les données via des fonctions de rappel.
Lorsque les données qui doivent être traitées ne peuvent pas être chargées en mémoire en même temps, ou lorsque le traitement est plus efficace pendant la lecture, nous devons utiliser des flux de données.
NodeJS fournit des opérations sur les flux de données via divers flux.
Le site officiel fournit des méthodes de pipeline:
La copie de code est la suivante:
// Exemple de demande du client
var zlib = require ('zlib');
var http = require ('http');
var fs = require ('fs');
var demande = http.get ({hôte: 'homeway.me',
chemin: '/',
Port: 80,
En-têtes: {'accepter-codage': 'gzip, dégonfler'}});
request.on ('réponse', fonction (réponse) {
var output = fs.createwRiteStream ('izs.me_index.html');
switch (réponse.Headers ['Content-Encoding']) {
// ou, utilisez simplement zlib.createunzip () pour gérer les deux cas
cas «gzip»:
Response.Pipe (zlib.CreateGunzip ()). PIPE (sortie);
casser;
cas «dégonfler»:
Response.Pipe (zlib.CreateInflate ()). Pipe (sortie);
casser;
défaut:
réponse.Pipe (sortie);
casser;
}
});
0x03. Compression sans tuyaux
Le code est le suivant:
La copie de code est la suivante:
#! / usr / local / bin / nœud
var http = requis ('http'),
QueryString = require ('QueryString'),
zlib = require ('zlib');
var args = {
// Paramètres et données de sauvegarde
Contenu: QueryString.stringify ({
// Informations contractuelles
Nom: «Homeway.me»,
}),
};
Var Options = {
nom d'hôte: «homeway.me»,
Port: 80,
chemin: '/',
Méthode: «Get»,
En-têtes: {
'Accepter': 'text / html, application / xhtml + xml, application / xml; q = 0,9, image / webp, * / *; q = 0,8',
«Content-Length»: args.contents.length,
'Utilisateur-agent': 'Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_2) Applewebkit / 537.36 (khtml, comme gecko) Chrome / 42.0.2311.11 Safari / 537.36',
«Accept-codage»: «gzip, dégonflage»,
},
};
var get = fonction (options, args, rappel) {
var req = http.request (options, fonction (res) {
var chunks = [], data, codage = res.headers ['contenu-coding'];
// non gzip / Deflate doit être converti au format UTF-8
if (encoding === 'Undefined') {
res.setEncoding ('UTF-8');
}
res.on ('data', fonction (chunk) {
Chunks.push (morceau);
});
res.on ('end', function () {
var buffer = buffer.concat (morceaux);
if (encoding == 'gzip') {
zlib.gunzip (tampon, fonction (err, décodé) {
data = décoded.toString ();
rappel (err, args, res.headers, données);
});
} else if (encoding == 'dégonger') {
zlib.inflate (tampon, fonction (err, décodé) {
data = décoded.toString ();
rappel (err, args, res.headers, données);
});
} autre {
data = buffer.toString ();
rappel (null, args, res.headers, données);
}
});
});
req.write (args.contents);
req.end ();
};
get (options, args, fonction (err, args, en-têtes, données) {
console.log ('==> en-tête / n', en-têtes);
console.log ('== data / n', data);
});
Ce qui précède est tous les NodeJS concernant la compression GZIP / Deflate. J'espère que tout le monde aime ça.