2015-11-04 16 views
6

Ho riscontrato un problema con una chiamata di arricciatura di grandi dimensioni.Curl: trasferimento chiuso con dati di lettura in sospeso rimanenti

ottengo

  • nread < = 0, il server ha chiuso la connessione, il salvataggio
  • trasferimento è chiuso con dati letti eccezionali restante

e il contenuto è parziale consegnato

GET /stats/?stats_breakdown=track__track&campaign=&search_criteria=2&period=0&date_month=11&date_day=03&date_year=2015&start_date_month=11&start_date_day=03&start_date_year=2015&end_date_month=12&end_date_day=31&end_date_year=2014 HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 
Host: domain.com 
Accept: */* 
Cookie: sessionid=xxg4gglsm7o3b224wihqz8od19wl31h1; csrftoken=JBpLxNtgAVvDEw2wNqvBnRmzDJIjxL6C 
Cache-Control: no-cache 
Connection: Keep-Alive 
Keep-Alive: 600 
Accept-Language: en-us 
X-CSRFToken: SeN9bHryRK8FWLTLJIs5c6u9AZ47a8pR 
Content-Type: application/x-www-form-urlencoded 
Origin: https://domain.com 
Referer: https://domain.com 

* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* additional stuff not fine transfer.c:1037: 0 0 
* HTTP 1.1 or later with persistent connection, pipelining supported 
< HTTP/1.1 200 OK 
< Server: nginx/1.8.0 
< Date: Wed, 04 Nov 2015 12:54:05 GMT 
< Content-Type: text/html; charset=utf-8 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< Vary: Accept-Encoding 
< Vary: Cookie, Accept-Language 
< P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI" 
< Content-Language: en 
* Replaced cookie csrftoken="JBpLxNtgAVvDEw2wNqvBnRmzDJIjxL6C" for domain domain.com, path /, expire 1478091245 
< Set-Cookie: csrftoken=JBpLxNtgAVvDEw2wNqvBnRmzDJIjxL6C; expires=Wed, 02-Nov-2016 12:54:05 GMT; Max-Age=31449600; Path=/; secure 
< 
* nread <= 0, server closed connection, bailing 
* transfer closed with outstanding read data remaining 
* Closing connection #0 

Questa è la configurazione di PHP che uso

function getHeaders() 
{ 
    $headers = array(); 
    $headers[] = 'Cache-Control: no-cache'; 
    $headers[] = 'Connection: Keep-Alive'; 
    $headers[] = 'Keep-Alive: 600'; 
    $headers[] = 'Accept-Language: en-us'; 
    $headers[] = 'X-CSRFToken: SeN9bHryRK8FWLTLJIs5c6u9AZ47a8pR'; 

    $headers[] = 'Content-Type: application/x-www-form-urlencoded'; 
    $headers[] = 'Origin: https://domain.com'; 
    $headers[] = 'Referer: https://domain.com'; 

    return $headers; 

} 

curl_setopt($connection, CURLOPT_URL, $url); 
    curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($connection, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($connection, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
    curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($connection, CURLOPT_COOKIEFILE, 'cookie.txt'); 
    curl_setopt($connection, CURLOPT_COOKIEJAR, 'cookie.txt'); 
    curl_setopt($connection, CURLOPT_CONNECTTIMEOUT ,550000000); 
    curl_setopt($connection, CURLOPT_TIMEOUT, 5500000000); //timeout in seconds 
    curl_setopt($connection, CURLOPT_HTTPHEADER, getHeaders()); 
    curl_setopt($connection, CURLOPT_VERBOSE, 1); 
+0

Stai colpendo un server dietro un bilanciamento del carico o qualche protezione DDOS come miracloud? potrebbero chiudere connessioni lunghe per motivi di sicurezza, anche se si dispone di flussi di dati – Bolovsky

+0

Non ho alcun controllo sul server remoto. Ma carica perfettamente in chrome .. –

risposta

5

Ok, dopo una ricerca e una chat IRC ho trovato una soluzione, ma non sicura al 100% quale sia la causa. Sembra che i keep-alive non siano stati inviati abbastanza per mantenere attiva la connessione. Pubblicheremo la soluzione qui, spero di poter aiutare qualcuno.

Quello che ha aiutato per me è l'aggiunta

--keepalive-time 2 

Una spiegazione dell'opzione ricciolo

--keepalive-time <seconds> 

Questa opzione imposta il tempo di una connessione deve rimanere inattivo prima inviare sonde keepalive e il tempo tra i singoli sensori keepalive . È attualmente efficace sui sistemi operativi che offrono le opzioni socket TCP_KEEPIDLE e TCP_KEEPINTVL (ovvero Linux, recente AIX, HP-UX e altro). Questa opzione non ha effetto se --no-keepalive è usato. (Aggiunto in 7.18.0)

Se questa opzione viene utilizzata più volte, verrà utilizzata l'ultima. Se non specificato, l'opzione viene impostata automaticamente su 60 secondi.

Sembra che il valore predefinito fosse troppo alto per mantenere aperta la mia connessione.

Ecco il comando completo che ho usato per la mia chiamata

curl URL -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,et;q=0.6,nl;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Connection: keep-alive' --compressed -v --keepalive-time 2 

e sto correndo questa versione di riccio su OSX

curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5 
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

Se qualcuno vorrebbe avere questa opzione utilizzata in PHP arricciatura, l'opzione --keepalive-time è disponibile da PHP 5.5.Puoi utilizzarlo come segue:

curl_setopt($connection, CURLOPT_TCP_KEEPALIVE, 1); 
curl_setopt($connection, CURLOPT_TCP_KEEPIDLE, 2); 

Spero che questo aiuti qualcuno a lottare con lo stesso problema!

+0

Come aggiungere 'CURLOPT_TCP_KEEPALIVE' e' CURLOPT_TCP_KEEPIDLE' in php 'Guzzle/HttpClient'? –

+0

@ user6067756 Devi solo passarli come impostazioni di curl: https://justrocketscience.com/post/guzzle-transfer-closed-n-bytes-remaining-read – NaN

1

libcurl dice solo che la connessione è stata tagliata dal server in modo impuro in cui non ha espresso dati che aveva promesso di fare. Sembra che la codifica chunked non segnali la fine del trasferimento.

I browser sono noti per essere estremamente liberali in ciò che ricevono in modo che trascurino e si adattino a qualsiasi tipo di violazione del protocollo in misura molto maggiore rispetto a libcurl.

1

Incontrato problema simile, il mio server è dietro nginx. Curl è in grado di ricevere la risposta se si connette al server direttamente, ma se ricciolo si connette al server tramite nginx, ricciolo sta gettando sotto l'errore

"Session * trasferimento è chiuso con dati letti eccezionali rimanenti * connessione Chiusura 0 ricciolo: (18) il trasferimento è chiuso con dati letti eccezionali restante

Quando mi collego alla stessa URL nginx utilizzando il browser, risposta sta rivelando bene. E 'molto strano, quando ho provato a connettersi a stesso URL nginx usando curl, si stava gettando errore precedente

Dopo aver confrontato le intestazioni inviate dal browser e l'arricciatura. ha scoperto che il browser è in grado di ricevere risposta a causa di un colpo di testa di sotto del quale ricciolo non sta inviando

'Accept-Encoding: gzip' 

Sent sopra intestazione usando curl, si sta lavorando bene. Quindi, ciò che sta facendo l'intestazione sopra è comprimere la risposta a gzip riducendo così la dimensione della risposta.

Dopo un po 'di ricerche, abbiamo scoperto che nginx non è in grado di inviare payload> 80kb. Dopo sprecare molto tempo, ha scoperto che problema è con nginx buffering e nginx ha funzionato come fascino dopo l'aggiunta di sotto proprietà proxy_buffering in nginx.conf

location/{ 
proxy_buffering off; 
} 

risposta accettata non ha risolto il mio problema. Scrivendo questa risposta, in modo che nessuno debba sprecare il proprio tempo se si trova di fronte allo stesso problema di me.

Problemi correlati