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?
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
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
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");