Estou executando o Mac OS 10.11.6 El Capitan. Há um link que eu gostaria de baixar programaticamente:
https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
Se eu colar esse URL em qualquer navegador (por exemplo, Safari), o download funcionará perfeitamente.
No entanto, se eu tentar baixar o mesmo URL da linha de comando usando curl
, ele não funcionará - o resultado é um arquivo vazio:
$ 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
$
É claro que posso obter o arquivo pelo navegador, mas gostaria de entender por que o curl
comando acima não funciona.
Por que não é possível fazer o curl
download desse arquivo corretamente, quando está evidentemente presente no site e pode ser acessado e baixado corretamente através de um navegador gráfico?
User-Agent
. Além disso, alguns downloads de navegadores podem ser bem-sucedidos devido à presença de cookies de sessão (ou seja, se você estiver logado) presente apenas no navegador.curl -v
para "detalhado". Irá imprimir no erro padrão várias informações sobre a conexão, solicitação e resposta. Nesse caso, você verá que a resposta incluiHTTP 302 Found
(um código de redirecionamento) e umLocation
cabeçalho com o URL para o qual ir. Em seguida, você podeman curl
descobrir como instruí-lo a seguir os redirecionamentos.Respostas:
Há um redirecionamento no servidor-lado para o seguinte URL a:
http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
. Por ser uma CDN, o comportamento exato (se você é redirecionado ou não) pode depender da sua localização.curl
não segue os redirecionamentos por padrão. Para instruí-lo, adicione o-L
argumento:fonte
Se o navegador conseguir baixar o arquivo, você poderá inspecionar o que o navegador está fazendo. No google chrome, você pode usar o seguinte para ver o que está acontecendo.
1) [Exibir> Desenvolvedor> Ferramentas de desenvolvedor> Guia Rede> guia Cabeçalhos]
2) Clique no link de download.
3) O link do arquivo aparecerá na guia Ferramentas do desenvolvedor.
4) Clique com o botão direito do mouse no arquivo e selecione Copiar> Copiar como cURL.
Agora você tem um link de ondulação que funcionará. Provavelmente terá parâmetros em excesso que você pode cortar.
Mais detalhes: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
fonte
Vou converter um dos comentários deste post em uma resposta.
Existem muitos links HTTP / HTTPS que requerem determinados cabeçalhos para funcionar. Portanto, isso resultará em uma resposta funcional de um navegador da Web, mas não em uma solicitação da Web de back-end, como curl.
Acabei de encontrar um site que exigia todos os cabeçalhos a seguir. A falha em especificá-los resultou em um tempo limite.
fonte