Pourquoi curl ne téléchargera-t-il pas ce lien quand un navigateur le fera?

30

J'utilise Mac OS 10.11.6 El Capitan. Il y a un lien que je voudrais télécharger par programme:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

Si je colle cette URL dans n'importe quel navigateur (par exemple Safari), le téléchargement fonctionne parfaitement.

Cependant, si j'essaie de télécharger la même URL à partir de la ligne de commande curl, cela ne fonctionne pas - le résultat est un fichier vide:

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

Bien sûr, je peux obtenir le fichier via le navigateur, mais je voudrais comprendre pourquoi la curlcommande ci-dessus ne fonctionne pas.

Pourquoi ne peut-il pas curltélécharger ce fichier correctement, alors qu'il est manifestement présent sur le site Web et peut être correctement accédé et téléchargé via un navigateur Web graphique?

mattobob
la source
7
Je voudrais souligner que même si la réponse de techraf sur les redirections est complètement correcte, d'autres facteurs tels que les en-têtes peuvent amener un serveur à rejeter la demande du client curl de télécharger un fichier. Par exemple, si le serveur dispose d'une protection DDoS dorsale, un tel logiciel de protection vérifie généralement la présence d'en-têtes de navigateur viables, comme le fait d'avoir un bon User-Agent. De plus, certains téléchargements de navigateur peuvent réussir en raison de la présence de cookies de session (c'est-à-dire si vous êtes connecté) uniquement sur ledit navigateur.
Joseph A.
6
Pour dépanner une commande curl, vous pouvez utiliser curl -vpour "verbose". Il imprimera à l'erreur standard diverses informations sur la connexion, la demande et la réponse. Dans ce cas, vous verriez que la réponse comprend HTTP 302 Found(un code de redirection) et un en- Locationtête avec l'URL vers laquelle aller. Ensuite, vous pourriez man curlsavoir comment lui dire de suivre les redirections.
Nathan Long

Réponses:

59

Il y a une redirection sur le côté serveur Web à l'URL suivante: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg. Puisqu'il s'agit d'un CDN, le comportement exact (que vous soyez redirigé ou non) peut dépendre de votre emplacement.

curlne suit pas les redirections par défaut. Pour lui dire de le faire, ajoutez l' -Largument:

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
Techraf
la source
6
Une redirection HTTPS vers HTTP? C'est affreux, et je ne suis pas surpris que Curl le laisse bien seul ...
Toby Speight
Et si cela ne le résout pas? Quelque chose à voir avec les trucs .asp peut-être?
mathtick
4

Si le navigateur est en mesure de télécharger le fichier, vous pouvez inspecter ce que fait le navigateur. Sur Google Chrome, vous pouvez utiliser ce qui suit pour voir ce qui se passe.

1) [Affichage> Développeur> Outils de développement> Onglet Réseau> onglet En-têtes]

2) Cliquez sur le lien de téléchargement.

3) Le lien du fichier apparaîtra sur l'onglet des outils de développement.

4) Faites un clic droit sur le fichier et sélectionnez Copier> Copier en tant que cURL.

Vous avez maintenant un lien curl qui fonctionnera. Il aura probablement des paramètres excédentaires que vous pouvez supprimer.

Plus de détails: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl

cage
la source
0

Je vais convertir l'un des commentaires de ce post en réponse.

Il existe de nombreux liens HTTP / HTTPS qui nécessitent certains en-têtes pour fonctionner. Ainsi, cela entraînera une réponse fonctionnelle d'un navigateur Web, mais pas une réponse fonctionnelle dans une demande Web principale comme curl.

Je viens de tomber sur un site qui nécessite tous les en-têtes suivants. L'omission de les spécifier a entraîné un délai d'attente.

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
Nicholas DiPiazza
la source