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


Je veux savoir comment procéder pour dépanner pourquoi une requête curl adressée à un serveur Web ne fonctionne pas. Je ne cherche pas une aide qui dépend 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", alors n’est-ce pas une communication bidirectionnelle? Si oui, alors pourquoi la réponse ne vient-elle pas aussi? Remarque: j'ai vérifié que mon service était opérationnel et que je renvoyais les réponses.

Notez que je suis un peu écolo à ce niveau de réseautage, alors n'hésitez pas à fournir du matériel d'orientation générale.


21
2017-10-17 18:29


origine


J'avais la même erreur, mais dans mon cas, c'était un logiciel VPN qui interceptait et bloquait un certain trafic réseau. Voir ici pour plus: stackoverflow.com/a/24189367/703200 - Chris Bartley


Réponses:


Vous devrez probablement résoudre ce problème du côté serveur, pas du côté client. Je crois que vous confondez une "réponse vide" avec "pas de réponse". Ils ne veulent pas dire 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 un nom. Si tel est le cas, en fonction de la configuration du serveur (le site que vous essayez d'exploiter est configuré par défaut), vous ne pouvez pas accéder au site par son adresse IP sans un peu de travail.

Vous pouvez tester cela côté client en modifiant 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: */*

14
2017-10-17 20:04



Je parviens à récupérer la page d'un autre client. Je pense que cela dépend du client sur certains réseaux. - chad
Et, comme pour la réponse vide = pas de réponse, je l’ai obtenue de stackoverflow.com/questions/5929971/…  , mais je suis disposé à considérer un deuxième avis;) - chad
Vous aurez toujours besoin de le résoudre du 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 eu. Pour ce qui est de empty vs no, j’ai trouvé un serveur qui se plaint de recevoir une réponse «vide» et j’ai définitivement reçu une réponse. * Empty reply from server de curl, la connexion a montré directement tous les en-têtes http pertinents avec le corps constitué purement de <!-- b5 -->. Si cela fonctionne avec curl ailleurs et pas sur un réseau spécifique, je regarderais les différences sur ce réseau. Un proxy se comportant mal peut-être? - yoonix


Curl est correct, mais ne donne pas beaucoup de commentaires lorsque les choses tournent mal. Comme vous pouvez le constater, wget peut vous donner plus d’informations, mais comme le mentionne yoonix, le côté serveur (c’est-à-dire les journaux d’erreur du serveur Web) est l’endroit où il faut regarder.

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

Vous pouvez également définir des noms d’hôte avec

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

6
2017-10-17 20:54





Essayer ce -> 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 correspondra exactement à ce que cURL verra lorsqu’il tentera de se connecter (mais qu’il dissimule inutilement auprès de vous). Maintenant, en fonction de ce que vous voyez ici, vous pouvez tirer l'une des conclusions suivantes:

Vous tentez de vous connecter à un site Web qui est un hôte virtuel basé sur un nom, ce qui signifie qu’il ne peut pas être atteint via une 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.


2
2017-09-07 20:29



Note (depuis que je vous ai vue posté cette même réponse dans une question différente de cURL): ces questions concernent cURL, le binaire CLI et non l'implémentation de l'habillage PHP que vous référencez. En d'autres termes, il n'y a pas une telle chose comme getinfo indicateur ou fonctionnalité pour CLI cURL. @voir curl.haxx.se - ken