Come risolvere i problemi di connettività quando curl ottiene una * risposta vuota *


27

Voglio sapere come procedere nella risoluzione dei problemi perché una richiesta di arricciatura a un server web non funziona. Non sto cercando un aiuto che dipenda dal mio ambiente, voglio solo sapere come raccogliere informazioni su quale parte della comunicazione fallisce, numeri di porta, ecc.

chad-integration:~ # curl -v 111.222.159.30
* About to connect() to 111.222.159.30 port 80 (#0)
*   Trying 111.222.159.30... connected
* Connected to 111.222.159.30 (111.222.159.30) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
> Host: 111.222.159.30
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host 111.222.159.30 left intact
curl: (52) Empty reply from server
* Closing connection #0

Quindi, capisco che una risposta vuota significa che l'arricciatura non ha ricevuto alcuna risposta dal server. Nessun problema, è esattamente quello che sto cercando di capire.

Ma quali informazioni più specifiche posso derivare da cURL qui?

È stato in grado di "connettersi" con successo, quindi ciò non comporta una comunicazione bidirezionale? In tal caso, perché non arriva anche la risposta? Nota, ho verificato che il mio servizio è attivo e le risposte di ritorno.

Nota, sono un po 'ecologico a questo livello di networking, quindi sentiti libero di fornire materiale di orientamento generale.


1
Stavo ottenendo lo stesso errore, ma nel mio caso era il software VPN che stava intercettando e bloccando un determinato traffico di rete. Vedi qui per maggiori informazioni: stackoverflow.com/a/24189367/703200
Chris Bartley

Risposte:


16

Probabilmente dovrai risolvere questo problema dal lato server, non dal lato client. Credo che stai confondendo una "risposta vuota" con "nessuna risposta". Non significano la stessa cosa. Probabilmente stai ricevendo una risposta che non contiene alcun dato.

Puoi testarlo semplicemente usando telnet invece di passare attraverso l'arricciatura:

telnet 111.222.159.30 80

Una volta connesso, incolla quanto segue (estratto dall'output di arricciatura):

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: 111.222.159.30
Accept: */*

Dovresti vedere la risposta esattamente come la vede l'arricciatura.

Un possibile motivo per cui si ottiene una risposta vuota è che si sta tentando di accedere a un sito Web che è un host virtuale basato sul nome. In tal caso, a seconda della configurazione del server (il sito che stai tentando di colpire sembra essere configurato come predefinito) non puoi raggiungere il sito tramite l'indirizzo IP senza un po 'di lavoro.

Puoi testarlo sul lato client semplicemente cambiando la riga 'Host' sopra; sostituisci www.esempio.it con il sito che stai tentando di raggiungere:

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: www.example.com
Accept: */*

Sono in grado di recuperare correttamente la pagina da un altro client. Penso che sia specifico per alcune reti su cui potrebbe trovarsi il client.
Ciad,

E, per quanto riguarda la risposta vuota = nessuna risposta, l'ho ottenuta da stackoverflow.com/questions/5929971/… , ma sono disposto a prendere in considerazione una seconda opinione;)
Ciad

1
Dovresti comunque risolvere il problema dal lato server. Se il server non sta inviando i dati, il client non saprà il perché. Sa solo che non l'ha capito. Per quanto riguarda vuoto vs no, ho trovato un server che si è lamentato di una risposta "vuota" e ho sicuramente ricevuto una risposta. * Empty reply from serverdal ricciolo, il collegamento ha mostrato direttamente tutte le intestazioni http rilevanti con il corpo costituito esclusivamente da <!-- b5 -->. Se funziona con curl altrove e non su una rete specifica, osserverei le differenze su quella rete. Forse un proxy che si comporta male?
Yoonix,

7

Il ricciolo va bene, ma non dà molti feedback quando le cose vanno male. (Come puoi dire) wget può darti maggiori informazioni, ma come menziona yoonix, il lato Server (ovvero i log degli errori del server web) è il posto dove cercare.

wget -S -O /dev/null http://www.example.com

Puoi anche impostare nomi host con

wget -s -O /dev/null --header="Host: foo.bar" http://www.example.com

2

Prova questo -> Invece di passare attraverso cURL, prova a eseguire il ping al sito che stai tentando di raggiungere con Telnet. La risposta che il tuo tentativo di connessione restituirà sarà esattamente ciò che cURL vede quando tenta di connettersi (ma che ti offusca inutilmente). Ora, a seconda di ciò che vedi qui, potresti trarre una delle diverse conclusioni:

Stai tentando di connetterti a un sito Web che è un host virtuale basato sul nome, il che significa che non può essere raggiunto tramite l'indirizzo IP. Qualcosa non ha funzionato con il nome host - potresti aver sbagliato a scrivere qualcosa. Nota che l'utilizzo di GET anziché POST per i parametri ti darà una risposta più concreta.

Il problema potrebbe anche essere legato all'intestazione 100-continue. Prova a eseguire curl_getinfo ($ ch, CURLINFO_HTTP_CODE) e controlla il risultato.


1
Nota (da quando ti ho visto pubblicare la stessa risposta in una domanda cURL diversa): queste domande riguardano cURL, il binario della CLI e non l'implementazione del wrapper PHP a cui fai riferimento. In altre parole, non esiste un getinfoflag o una funzione per CLI cURL. @vedi curl.haxx.se
ken,

0

In alcune occasioni con Windows WSL. L'esecuzione di curl all'interno di bash genererà lo stesso errore e questo perché Kasperksy lo sta bloccando dalla connessione a HTTP / s.

Questo errore è stato segnalato qui .

Una soluzione rapida è disabilitare la protezione di Kaspersky sulla porta che si sta tentando di raggiungere sul server (tcp 80 per exmaple).

Per farlo, vai su Kaspersky - Impostazioni - Impostazioni di rete - seleziona "Monitora solo le porte selezionate" - Seleziona le porte - fai doppio clic sulla porta (80) e seleziona inattivo

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.