Comment résoudre les problèmes de connectivité lorsque curl obtient une * réponse vide *

27

Je veux savoir comment procéder pour dépanner pourquoi une demande de bouclage vers un serveur Web ne fonctionne pas. Je ne cherche pas d'aide qui dépendrait de mon environnement, je veux juste savoir comment collecter des informations sur la partie de la communication qui échoue, les numéros de port, etc.

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

Donc, je comprends qu'une réponse vide signifie que curl n'a reçu aucune réponse du serveur. Pas de problème, c'est précisément ce que j'essaie de comprendre.

Mais quelles informations plus spécifiques puis-je tirer de cURL ici?

Il a réussi à "se connecter", donc cela n'implique-t-il pas une communication bidirectionnelle? Si oui, alors pourquoi la réponse ne vient-elle pas également? Remarque, j'ai vérifié que mon service est opérationnel et je retourne des réponses.

Remarque, je suis un peu vert à ce niveau de réseautage, alors n'hésitez pas à fournir du matériel d'orientation général.

tchad
la source
1
J'obtenais la même erreur, mais dans mon cas, c'était un logiciel VPN qui interceptait et bloquait certains trafics réseau. Voir ici pour plus: stackoverflow.com/a/24189367/703200
Chris Bartley

Réponses:

16

Vous devrez probablement résoudre ce problème côté serveur, pas côté client. Je crois que vous confondez une «réponse vide» avec «aucune réponse». Ils ne signifient pas la même chose. Vous obtenez probablement une réponse qui ne contient aucune donnée.

Vous pouvez tester cela en utilisant simplement telnet au lieu de passer par curl:

telnet 111.222.159.30 80

Une fois connecté, collez ce qui suit (tiré de votre sortie curl):

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: */*

Vous devriez voir la réponse exactement comme curl la voit.

Une raison possible pour laquelle vous obtenez une réponse vide est que vous essayez d'accéder à un site Web qui est un hôte virtuel basé sur le nom. Si c'est le cas, en fonction de la configuration du serveur (le site que vous essayez de visiter se trouve être configuré par défaut), vous ne pouvez pas accéder au site par adresse IP sans un peu de travail.

Vous pouvez tester cela du côté client en changeant simplement la ligne «Host» ci-dessus; remplacez www.example.com par le site que vous essayez d'atteindre:

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: */*
yoonix
la source
Je parviens à récupérer la page d'un autre client. C'est spécifique à certains réseaux sur lesquels le client peut être, je pense.
tchad
Et, comme pour la réponse vide = pas de réponse, je l'ai obtenue de stackoverflow.com/questions/5929971/… , mais je suis prêt à envisager un deuxième avis;)
chad
1
Vous auriez encore besoin de le dépanner côté serveur. Si le serveur n'envoie pas les données, le client ne saura pas pourquoi. Il sait seulement qu'il ne l'a pas compris. Quant à vide vs non, j'ai trouvé un serveur qui se plaignait d'une réponse «vide» et j'ai définitivement reçu une réponse. * Empty reply from serverde curl, la connexion directe a montré tous les en-têtes http pertinents avec le corps constitué uniquement de <!-- b5 -->. Si cela fonctionne avec curl ailleurs et non sur un réseau spécifique, j'examinerais les différences sur ce réseau. Un proxy mal se comporter peut-être?
yoonix
7

Curl est bien, mais ne donne pas beaucoup de commentaires lorsque les choses tournent mal. (Comme vous pouvez le voir) wget peut vous donner plus d'informations, mais comme le mentionne yoonix, le côté serveur (c'est-à-dire les journaux d'erreurs du serveur Web) est l'endroit où chercher.

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

Vous pouvez également définir des noms d'hôtes avec

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

Essayez ceci -> Au lieu de passer par cURL, essayez d'envoyer une requête ping au site que vous essayez d'atteindre avec Telnet. La réponse renvoyée par votre tentative de connexion sera exactement ce que cURL verra lorsqu'il essaiera de se connecter (mais qu'il vous masquera sans aide). Maintenant, en fonction de ce que vous voyez ici, vous pouvez tirer l'une des conclusions suivantes:

Vous essayez de vous connecter à un site Web qui est un hôte virtuel basé sur le nom, ce qui signifie qu'il ne peut pas être atteint via l'adresse IP. Quelque chose ne va pas avec le nom d'hôte - vous avez peut-être mal saisi quelque chose. Notez que l'utilisation de GET au lieu de POST pour les paramètres vous donnera une réponse plus concrète.

Le problème peut également être lié à l'en-tête 100-continue. Essayez d'exécuter curl_getinfo ($ ch, CURLINFO_HTTP_CODE) et vérifiez le résultat.

Felix
la source
1
Remarque (depuis que je vous ai vu posté cette même réponse dans une autre question cURL): ces questions concernent cURL, le binaire CLI et non l'implémentation du wrapper PHP auquel vous faites référence. En d'autres termes, il n'existe pas d' getinfoindicateur ou de fonctionnalité pour CLI cURL. @see curl.haxx.se
ken
0

Dans certains cas, sous WSL de Windows. L'exécution de curl dans bash générera la même erreur et c'est parce que Kasperksy l'empêche de se connecter à HTTP / s.

Ce bug a été signalé ici .

Une solution rapide consiste à désactiver la protection de Kaspersky sur le port que vous essayez d'atteindre sur le serveur (tcp 80 pour exmaple).

Pour cela, accédez à Kaspersky - Paramètres - Paramètres réseau - cochez "Surveiller uniquement les ports sélectionnés" - Sélectionnez les ports - double-cliquez sur le port (80) et sélectionnez inactif

entrez la description de l'image ici

AK_
la source