web-dev-qa-db-fra.com

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

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 un 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 en utilisant 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 commande curl ci-dessus ne fonctionne pas.

Pourquoi curl ne peut-il pas té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?

31
mattobob

Il existe une redirection côté serveur vers 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.

curl ne suit pas les redirections par défaut. Pour lui dire de le faire, ajoutez le -L argument:

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
60
techraf

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

6
cage

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");
0
Nicholas DiPiazza