De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

cURL. Um cliente para múltiplos protocolos

Colaboração: Romeu Henrique Capparelli Fonseca

Data de Publicação: 15 de Junho de 2006

Com o avanço das tecnologias para internet, muitos protocolos vêm se firmando como meios de comunicação eficientes ou, até mesmo, "padrões de mercado". Alguns desses protocolos são clássicos como, por exemplo, HTTP e FTP. Apesar da aparente simplicidade e da documentação abundante, desenvolver aplicações com eles requer bastante cuidado.

Seguindo o princípio UNIX de desenvolvimento (seja pequeno, faça apenas uma coisa, e a faça bem feito) aliado ao poder dos pipes do bash (veja: http://www.dicas-l.com.br/dicas-l/20000906.php), podemos facilitar o trabalho utilizando ferramentas de terceiros.

1. Introdução

No caso de clientes para protocolos FTP, FTPS, TFTP, HTTP, HTTPS, TELNET, DICT, FILE e LDAP existe o cURL. O cURL é uma ferramenta de linha de comando para transferir dados com sintaxe URL. Além de suportar esses protocolos, consegue também tratar certificados digitais, cookies, proxies e autenticação (incluindo NTLM, Basic, Digest, Negotiate, Kerberos...)

Outras possibilidades de uso podem ser: segmentar downloads de arquivo, continuar um download interrompido, tunelamento e muito mais. Vamos explorar algumas possibilidades mais adiante.

2. Exemplos

2.1. Download simples de arquivo

Suponha que desejamos baixar uma versão do kernel, podemos usar o wget:

  $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz

Ou o curl:

  $ curl http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz ```

2.2. Download simples de arquivo via proxy

Se eu preciso passar por um proxy:

  $ curl -x $PROXY_IP:$PROXY_PORTA \
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz \
  -o linux-2.6.16.tar.gz

2.3. Segmentando downloads

Existem algumas configurações de proxy/gateway que limitam a velocidade de download por conexão, assim, se tiveres mais de uma conexão a velocidade média de download pode aumentar bastante. Vamos primeiro descobrir o tamanho do arquivo usando a opção -I (header only):

  $ curl -I http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz |\
  grep Content-Length
  Content-Length: 51128010

Então, vamos dividir o trabalho em 5 partes de ~10 MB.

  $ curl --range 0-10485760 
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz.part1 &
  
  $ curl --range 10485761-20971520 
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz.part2 &
  
  $ curl --range 20971521-31457280 
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz.part3 &
  
  $ curl --range 31457281-41943040 
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz.part4 &
  
  $ curl --range 41943041-52428800 
  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.16.tar.gz 
  -o linux-2.6.16.tar.gz.part5 &

É claro que pode ser feito um algoritmo que calcule o tamanho adequado das partes. Ao final do download, quando todos os comandos retornarem, pode-se unir as partes e testar o arquivo:

  $ cat linux-2.6.16.tar.gz.part* > linux-2.6.16.tar.gz
  $ tar -tzf linux-2.6.16.tar.gz \
  && echo Arquivo OK || echo Arquivo com defeito

2.4. Upload de arquivo e formulários em HTTP

Suponha que eu queira realizar em lote o envio de alguns arquivos a algum site. Dependendo da quantidade, pode ser algo moroso. O cURL pode auxiliar esse tipo de tarefa. No exemplo aqui usado o site http://www.toolpanel.org/imagestuff/asciigenerator/ possui um formulário para conversão de imagens em ascii-art. Suponha que eu queira converter algumas dezenas de imagens... seria muito mais fácil em lote e em linha de comando.

O formulário dessa página é composto de alguns controles (checkboxes, inputs, file). No Firefox/Mozilla/Netscape podemos usar a ferramenta "Propriedades da página" para listar todos os controles e o ACTION, que é o destino dos dados entrados no formulário. Estudando a estrutura do formulário e testando com algumas de minhas imagens noto que o comando a seguir é suficiente:

  $ curl http://www.toolpanel.org/imagestuff/asciigenerator/asciiartist/generate.php \
  -F file=@logo.gif  \
  -F resolution=1 -F mode=3 -F fixed_char=W -F font-size=3 \
  -F line-height=2 -F letter-spacing=0 -o saida.html

O parâmetro -F <input name>=<input value> envia os dados como se fosse um dos controles do formulário. Para o caso de arquivos usa-se -F <input name>=@<caminho do arquivo>.

E voi-la. O html contém a conversão da minha figura em ascii-art (e algum banner).

3. Conclusão

O que foi mostrado aqui é bem superficial e tem o intuito de despertar o interesse sobre a ferrramenta mais do que servir como manual. Foi explorado apenas algumas poucas características de um dos tantos protocolos suportados. O cURl é um cliente simples e que associado a conjuntos de ferramentas de console pode substituir grandes sistemas.

4. Saiba Mais

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Romeu Henrique Capparelli Fonseca