[Dicas-L] chttp://www.Dicas-L.com.br/dicas-l/20060615.php. Um cliente para multiplos protocolos
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.
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.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
$ 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
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
-o linux-2.6.16.tar.gz.part2 &
$ curl --range 20971521-31457280
-o linux-2.6.16.tar.gz.part3 &
$ curl --range 31457281-41943040
-o linux-2.6.16.tar.gz.part4 &
$ curl --range 41943041-52428800
-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).
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.