Olá pessoal…
Hoje deixei o aiBur Framework de lado para fazer algumas coisas divertidas… =)
Um antigo camarada de programação ASP que está fazendo algumas brincadeiras com linux e SQUID me perguntou esses dias como ele poderia fazer um POST via linha de comando… Eu que não sabia exatamente o que ele queria indiquei:
echo "nome=danilo&idade=20" | lynx --post-data http://www.meusite.com.br/meu_post.php
Como muitos devem saber, este comando funciona perfeitamente para enviar POSTs via linha de comando. Mas meu amigo precisava de algo mais “bruto”. Ele precisava fazer, por exemplo, POST de um arquivo… Lá vai o Danilo arranjar uma solução…
Aqui vou conciliar uma dica que escrevi a muito tempo atrás para o vivaolinux, e a idéia sobre Headers HTTP que vi no BrunoTorres.net.
Ferramentas que vamos utilizar:
TCPUTILs -> Tcputils é um pacote que contém um conjunto de ferramentas para utilizar sockets diretamente pelo Shell… Na verdade é um servidor e cliente de echo… Quase como um telnet. Mas dá pra fazer algumas coisas bacanas com ele, que nós veremos agora…. =)
HTTP -> Hypertext Transfer Protocol ou Protocolo de transferência de hipertexto: é o formato da comunicação entre o Browser e o servidor. Por exemplo, é o cliente que envia cookies, o servidor que grava sessions, redireciona, etc etc etc… Seu padrão é definido pela W3C
LivehttpHeaders Extension: Extenção do Firefox que visualiza todos os headers de uma requisição http.
Bom, vamos brincar um pouco:
Precisamos primeiramente instalar o pacote TCPutil. Como eu uso Debian, é fácil:
apt-get install tcputil
Depois de instalado, virá uma lista de comandos. Iremos usar apenas o tcpconnect. Outros podem ser visto na documentação (man tcpconnect) ou no meu artigo citado acima…
A descrição do comando é a seguinte:
tcpconnect [HOST] [porta]
Após a conexão estabilizada, o cliente (no caso, você) poderá enviar suas strings de conexão. No caso, poderá mandar cabeçalhos HTTP para o servidor. Vamos fazer um teste?
tcpconnect danilocesar.com 80
Após a conexão com o servidor, você enviará os seguintes Headers do HTTP:
GET /blog/index.php HTTP/1.1
Host: www.danilocesar.com
Este é, talvez, o cabeçalho mais simples que uma requisição HTTP pode ter. Vamos entende-la:
GET -> É o método de envio de dados
/blog/index.php -> É a página que eu estou querendo
HTTP/1.2 -> É a versão do protocolo HTTP que estou usando
Host: -> É o Host que você está buscando.
E como respostas você vai ter os Headers vindos do Servidor e o código HTML específico da página.
Agora, nem todos os Headers que estaremos enviando possuem apenas 2 linhas. Para facilitar a nossa vida, colocaremos o cabeçalho HTTP agora em um arquivo texto e iremos enviar os headers assim:
tcpconnect danilocesar.com 80 < headers.txt
Creio que vá facilitar a nossa vida... Bom, vamos continuar.
Meus testes agora vão ser feitos no meu localhost… Por poder editar melhor os arquivos e tals….
Creio que está na hora de enviar-mos alguns Headers mais “Pró”
Se você está com preguiça de ler a documentação do HTTP, podemos visualizar os Headers que o firefox envia utilizando a extenção LiveHTTPHeaders.
Vamos fazer um teste…. Com a extensão devidamente instalada, aperte ALT + L, e acesse uma página qualquer. Por exemplo, http://www.google.com.br
Os Headers que enviamos
GET / HTTP/1.1
Host: www.google.com.br
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: pt-br
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: KIDYMD=#243194:FBOB#
Cuidado: As propriedades dos headers devem ocupar apenas uma linha cada uma. Toda quebra de linha a mais é feita pelo browser e deve ser discartada
Os Headers que recebemos
HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html
Content-Encoding: gzip
Server: GWS/2.1
Content-Length: 1556
Date: Sun, 19 Feb 2006 16:25:35 GMT
Se você enviar estes mesmos headers no pelo tcpconnect, talvez você receba apenas algumas Strings estranhas, pois a informação vem toda compactada do Servidor pelo gzip. Para ver as informações inteiras, retire a linha “Accept-Encoding: gzip,deflate ” do seu header.
Agora, dentro do seu LiveHTTPHeaders, dê um Clean, volte ao google e busque por HTTP:
Temos agora 2 diferenças nos Headers.
GET /search?hl=pt-BR&q=HTTP+Headers&btnG=Pesquisa+Google&meta= HTTP/1.1
Referer: http://www.google.com.br/
O get agora está bem mais incrementado certo? Ele contém as Strings de busca do google.
Um novo Header foi enviado pelo browser: Referer. Ele indica o caminho completo da página de onde você veio. Isto é muito utilizado para quebrar spammers de blog (método bem inseguro, mas quebra boa parte dos spammers), para estatisticas (quais sites possuem links para o seu).
E os prometidos arquivos?
Vamos agora aprender a enviar arquivos. Na verdade, não muda muita coisa.
POST /obj/teste.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: pt-br
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/obj/teste.php
Content-Type: multipart/form-data; boundary=--BoRdEr_Signature-00253658974569--
Content-Length: 700
----BoRdEr_Signature-00253658974569--
Content-Disposition: form-data; name="teste"; filename="source.list"
Content-Type: text/plain
#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main
#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main
#deb file:/ apt/
#deb http://security.debian.org/ testing/updates main contrib
deb http://security.debian.org/ etch/updates main contrib non-free
#deb http://ftp.debian.org/debian/ unstable main
#deb-src http://ftp.pucpr.br/debian/ testing main
deb http://ftp.debian.org/debian/ testing main
deb-src http://ftp.debian.org/debian/ testing main
----BoRdEr_Signature-00253658974569----
No caso, estou mandando o meu arquivo Source.list Vamos às descrições:
Content-Type: multipart/form-data; – Indica o tipo do conteúdo
boundary=–BoRdEr_Signature-00253658974569– Indica o separador de conteúdo.
Content-Length: 700 – Tamanho do seu arquivo.
A parte de dentro seria o seu arquivo propriamente dito…
Content-Type: text/plain – Tipo do conteúdo. No caso, texto plano, mas poderia ser uma imagem, um executável, etc et.
Da mesma forma, o código acima funciona com imagens, mas não mostro aqui com imagens pois seria inútil, pois provavelmente viria encriptada…
Bom, e termina aqui a descrição do problema e da solução.
Caso tenha problemas, ou sugestõe, comente abaixo.
[]s!
O tcpconnect tem um número máximo de caracteres de resposta. Isso pode dar algum problema com Headers muito grandes
4 Comments
Ola amigo eu tenho um problema que talvez voce saiba me ajudar
estou fazendo uma pagina php que é acessada por um modulo gsm
atraves de uma comuincacao gprs
envio a seguinte linha como voce mostrou acima como exemplo
GET /blog/index.php?dado=1 HTTP/1.1 (ou mesmo colocar POST da na mesma)
Host: http://www.danilocesar.com
isto uso para enviar o dado para a pagina que faz o trabalho de colocar isto no meu banco de dados
em seguida ele me retorna
HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html
Content-Encoding: gzip
Server: GWS/2.1
Content-Length: 1556
Date: Sun, 19 Feb 2006 16:25:35 GMT
mas isto pra mim nao serve pra nada pois nao preciso desta resposta e como uso gprs isto esta gastando muito, sera que existe um jeito de nao receber esta resposta?
Obrigado amigo
Certo….
Bom, que eu saiba não tem como não.
O que você pode fazer é uma espécie de proxy HTTP que receba uma string de conexão e retorne pra você os dados devidamente tratados….
Mas simplesmente não receber os dados eu acho que não dá não….
[]‘s
Danilo
ola danilo .. gostei do seu post mas nao consegui rodar o comando tcpconnect
da um erro dizendo que o servidor nao pode ser alcaçado … sabe o que pode ser isso!
flw
Estou com um problema e não achei a solução na internet, gostaria
de saber se alguém já passou por isso.
Eu instalei o wordpress, configurei, mas quando eu mudo a
configuração de Links Permanentes de Padrão para Estrutura
Personalizada, o wordpress funcionama perfeitamente mais no rodapé
do blog todo aparece esses códigos HTTP/1.1 200 OK Date: Fri, 28
Nov 2008 21:07:04 GMT Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8
OpenSSL/0.9.8b mod_auth_passthrough/2.1 mod_bwlimited/1.4
FrontPage/5.0.2.2635 mod_perl/2.0.3 Perl/v5.8.8 Content-Length: 0
Keep-Alive: timeout=5, max=96 Connection: Keep-Alive Content-Type:
application/x-httpd-php5
Quando eu volto para a configuração de Links Permanentes de Padrão
ele não aparece mais.
Alguém já passou por isso??
Post a Comment