logo       

cURL. Um cliente para múltiplos protocolos: msg#02627

culture.publications.dicas

Subject: cURL. Um cliente para múltiplos protocolos

cURL. Um cliente para múltiplos protocolos
==========================================

Colaboração: Romeu Henrique Capparelli Fonseca

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=@xxxxxxxx \
-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
=============

- Sítio oficial cURL (http://curl.haxx.se/)
- PHP e cURL (http://us3.php.net/curl)
- cURL no Wikipedia (http://en.wikipedia.org/wiki/CURL)



<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise