2013-03-26 12 views
7

Tak więc w tym (uproszczonym) bicie kodu, gdy ktoś trafi na mój serwer węzła, wysyłam żądanie GET do innej strony internetowej i wypisuję tytuł strony HTML do konsoli. Działa dobrze:Jak ograniczyć długość odpowiedzi za pomocą http.request w Node.js

var http = require("http"); 
var cheerio = require('cheerio'); 

var port = 8081; 
s = http.createServer(function (req, res) { 
var opts = { 
    method: 'GET', 
    port: 80, 
    hostname: "pwoing.com", 
    path: "/" 
}; 
http.request(opts, function(response) { 
    console.log("Content-length: ", response.headers['content-length']); 
    var str = ''; 
    response.on('data', function (chunk) { 
     str += chunk; 
    }); 
    response.on('end', function() { 
     dom = cheerio.load(str); 
     var title = dom('title'); 
     console.log("PAGE TITLE: ",title.html()); 
    }); 
}).end(); 
res.end("Done."); 
}).listen(port, '127.0.0.1'); 

Jednak w samej aplikacji użytkownicy mogą podać adres URL, który ma trafić. Oznacza to, że mój serwer węzłowy może pobierać pliki filmowe o wielkości 20 GB lub cokolwiek innego. Niedobrze. Nagłówek długości treści nie jest przydatny do zatrzymania tego, ponieważ nie jest przesyłany przez wszystkie serwery. Pytanie:

Jak mogę nakazać, aby zatrzymać żądanie GET po, powiedzmy, pierwsze 10 KB są odbierane?

Pozdrawiam!

+0

Co powiesz na sprawdzenie typu zawartości/typu mime? – Amberlamps

+0

Mogę przypuszczać, ale podobnie jak długość treści, to nie jest niezawodny wskaźnik - serwer, do którego wysyłam żądanie, nadal może wysyłać dane o dowolnej długości. ... tak jak ja to rozumiem! Na pewno musi istnieć sposób "zawieszenia się" po pierwszych 10 kilogramach ciała. – BaronVonKaneHoffen

+0

Innym rozwiązaniem, które warto rozważyć, jest użycie strumieni i przesłanie ich do klienta, tak aby nie buforował całej odpowiedzi. http://docs.nodejitsu.com/articles/advanced/streams/how-to-use-stream-pipe –

Odpowiedz

13

Można przerwać żądanie po przeczytaniu dość dane:

http.request(opts, function(response) { 
    var request = this; 
    console.log("Content-length: ", response.headers['content-length']); 
    var str = ''; 
    response.on('data', function (chunk) { 
     str += chunk; 
     if (str.length > 10000) 
     { 
     request.abort(); 
     } 
    }); 
    response.on('end', function() { 
     console.log('done', str.length); 
     ... 
    }); 
    }).end(); 

Spowoduje to przerwanie żądania w całym 10,000 bajtów, ponieważ dane przybywa w kawałki o różnych rozmiarach.

+0

Aha! Tego właśnie potrzebowałem. Bardzo doceniane :) – BaronVonKaneHoffen

+0

Czy możesz mnie oczyścić? Sprawdziłem, dodając plik console.log ("coś") tuż przed "str + = chunk", rejestruje się tylko raz, ale jestem pewien, że otrzymuję wiele porcji danych, więc w takim przypadku powinien on logować wiele razy. – Devasish

+0

@Devasish tak, można by się tego spodziewać, chyba że używasz tego samego kodu co moja odpowiedź i żądanie zostanie przerwane? – robertklep

Powiązane problemy