2013-08-26 8 views
7

Ho il seguente script e sembra che il nodo non includa l'intestazione Content-Length nell'oggetto di risposta. Ho bisogno di conoscere la lunghezza prima di consumare i dati e dato che i dati potrebbero essere abbastanza grandi, preferisco non archiviarli.In node.js, come ottengo l'intestazione Content-Length in risposta a http.get()?

http.get('http://www.google.com', function(res){  

    console.log(res.headers['content-length']); // DOESN'T EXIST 
}); 

Ho navigato su tutto l'albero degli oggetti e non vedo nulla. Tutte le altre intestazioni sono nel campo "intestazioni".

Qualche idea?

+0

Rilasciare a per (var k in res.headers) {console.log (k, res.headers [k]); } per vedere tutte le chiavi disponibili nelle intestazioni. Potrebbe essere una cosa di capitalizzazione. –

+0

Grazie, ma ho già ispezionato l'albero degli oggetti e vedo tutto eccetto l'intestazione della lunghezza del contenuto. – mike

+0

@CharlieKey [Tutti i nomi dei campi di intestazione nell'oggetto risposta sono in minuscolo, a prescindere dal caso in cui si trovano effettivamente.] (Https://nodejs.org/api/http.html#http_message_headers) –

risposta

7

www.google.com non invia un Content-Length. Utilizza chunked encoding, che si può capire dall'intestazione Transfer-Encoding: chunked.

Se si desidera che le dimensioni del corpo della risposta, ascoltare data eventi res s', e aggiungere la dimensione del buffer ricevuto a una variabile contatore. Quando viene attivato end, hai la dimensione finale.

Se si è preoccupati per le risposte di grandi dimensioni, interrompere la richiesta una volta che il contatore supera il numero di byte.

+0

Ouch. Stavo usando il violinista per ispezionare la risposta e non mi ero reso conto che il violinista stava aggiungendo quell'intestazione. – mike

+1

@ mike: Sì, se Fiddler non è in modalità Streaming, bufferizzerà internamente l'intera risposta e quindi invierà un 'Content-Length' intestazione per il browser. Fai clic sul pulsante ** Stream ** nella barra degli strumenti e Fiddler non lo farà. – josh3736

3

Non tutti i server invieranno intestazioni content-length.

Ad esempio:

http.get('http://www.google.com', function(res) { 
    console.log(res.headers['content-length']); // undefined 
}); 

Ma se richiesta SO:

http.get('http://stackoverflow.com/', function(res) { 
    console.log(res.headers['content-length']); // 1192916 
}); 

Stai correttamente tirando che colpo di testa dalla risposta, Google ha appena non invia sulla loro home page (che usano codifica piuttosto chunked).

Problemi correlati