0x01. Um
Beim Schreiben von HTTP wird der verstümmelte Code beim Empfangen von HTTP -Anfragen angezeigt. Später stellte ich fest, dass Gzip nicht dekomprimiert ist.
In Bezug auf die GZIP/Deflat-Komprimierung gibt es Methoden zum Einsetzen von Rohrkompression und Nicht-Rohrkomprimierung.
0x02.Pipe -Komprimierung
Die E/A im Knoten ist asynchron. Das Lesen und Schreiben auf Scheibe und Netzwerk muss daher über Rückruffunktionen gelesen und schreiben.
Wenn die Daten, die verarbeitet werden müssen, nicht gleichzeitig im Speicher geladen werden können oder wenn die Verarbeitung beim Lesen effizienter ist, müssen wir Datenströme verwenden.
NodeJS bietet Operationen in Datenströmen über verschiedene Streams.
Die offizielle Website enthält Pipeline -Methoden:
Die Codekopie lautet wie folgt:
// Client -Anforderungsbeispiel
var zlib = required ('zlib');
var http = required ('http');
var fs = fordert ('fs');
var request = http.get ({host: 'homeway.me',,
Weg: '/',
Port: 80,
Headers: {'Akzeptieren von Coding': 'gzip, Deflate'}});
Request.on ('Antwort', Funktion (Antwort) {
var output = fs.createwritestream ('izs.me_index.html');
Switch (response.Headerers ['Content-Coding']) {
// oder verwenden Sie einfach zlib.createunzip (), um beide Fälle zu verarbeiten
Fall 'Gzip':
Antwort.Pipe (Zlib.CreateGunzip ()). Pipe (Ausgang);
brechen;
Fall 'Deflate':
Antwort.Pipe (Zlib.CreateInflate ()). Pipe (Ausgang);
brechen;
Standard:
Antwort.Pipe (Ausgabe);
brechen;
}
});
0x03. Nicht-Rohrkomprimierung
Der Code ist wie folgt:
Die Codekopie lautet wie folgt:
#! /usr/local/bin/node
var http = required ('http'),
QueryString = Request ('QueryString'),
zlib = require ('zlib');
var args = {
// Parameter und Sicherungsdaten
Inhalt: queryString.stringify ({{
// Vertragsinformationen
Name: 'Homeway.me',
}),
};
var options = {
Hostname: 'Homeway.me',
Port: 80,
Weg: '/',
Methode: 'Get',
Header: {
'Akzeptieren': 'Text/HTML, Anwendung/xhtml+xml, application/xml; q = 0,9, Bild/webp,*/*; q = 0,8',,
'Inhaltslänge': args.contents.length,
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS x 10_10_2) Applewebkit/537.36 (KHTML, wie Gecko) Chrome/42.0.2311.11 Safari/537.36',,
"Akzeptieren-Codierung": "Gzip, Deflate",
},
};
var get = function (Optionen, Argumente, Rückruf) {
var req = http.request (Optionen, Funktion (res) {
var chunks = [], data, coding = res.Headers ['content-coding'];
// Nicht-GZIP/Deflate sollte in das UTF-8-Format konvertiert werden
if (coding === 'undefined') {
res.setencoding ('utf-8');
}
res.on ('Daten', Funktion (Chunk) {
thunks.push (Chunk);
});
res.on ('end', function () {
var buffer = buffer.concat (Stücke);
if (coding == 'gzip') {
zlib.gunzip (puffer, function (err, decoded) {
Data = decoded.toString ();
Rückruf (err, args, res.Headers, Daten);
});
} else if (coding == 'Deflate') {
Zlib.inflate (Puffer, Funktion (err, decodiert) {
Data = decoded.toString ();
Rückruf (err, args, res.Headers, Daten);
});
} anders {
Data = buffer.toString ();
Rückruf (Null, Args, Res.Headers, Daten);
}
});
});
req.write (args.contents);
req.end ();
};
GET (Optionen, Argumente, Funktion (Err, Args, Header, Daten) {
console.log ('==> header /n', Header);
console.log ('== data /n', data);
});
Das obige handelt von NodeJs über GZIP/Deflate -Komprimierung. Ich hoffe, es mag alle.