Por que o link não faz o download desse link quando o navegador o faz?

30

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 curlcomando acima não funciona.

Por que não é possível fazer o curldownload desse arquivo corretamente, quando está evidentemente presente no site e pode ser acessado e baixado corretamente através de um navegador gráfico?

mattobob
fonte
7
Gostaria de ressaltar que, embora a resposta do techraf sobre redirecionamentos esteja completamente correta, outros fatores, como cabeçalhos, podem fazer com que um servidor rejeite a solicitação do cliente curl para baixar um arquivo. Por exemplo, se o servidor tiver proteção de back-end DDoS, esse software de proteção geralmente verifica se há cabeçalhos viáveis ​​do navegador, como os adequados 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.
Joseph A.
6
Para solucionar problemas de um comando de curvatura, você pode usar curl -vpara "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 inclui HTTP 302 Found(um código de redirecionamento) e um Locationcabeçalho com o URL para o qual ir. Em seguida, você pode man curldescobrir como instruí-lo a seguir os redirecionamentos.
Nathan Long

Respostas:

59

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.

curlnão segue os redirecionamentos por padrão. Para instruí-lo, adicione o -Largumento:

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
techraf
fonte
6
Um redirecionamento de HTTPS para HTTP? Isso é terrível, e eu não estou surpreso que onda deixa bem sozinho ...
Toby Speight
E se isso não resolver? Algo a ver com as coisas .asp, talvez?
mathtick 14/01
4

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

cela
fonte
0

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.

  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
fonte