sexta-feira, 25 de julho de 2008

Analisando o HTTP(Fiddler)

Muitas vezes não será necessário depurar o HTTP, talvez alguns desenvolvedores experientes nem conheçam como efetivamente é uma mensagem HTTP de requisição ou resposta. Mas acho importante este conhecimento ou saber que existe meios para analisá-las.

Recentemente a Google fez uma análise de requisições feitas ao se logar no Gmail. Nesta análise eles usaram diversos programa como o Httpwatch, WireShark, Fiddler e outros internos. Com esta análise eles otimizaram bastante o desempenho desta funcionalidade! A idéia aqui é mostrar apenas o Fiddler, que é um HTTP Debugging Proxy, ou em português Proxy para depurar HTTP.

O Fiddler é grátis e pode ser baixado na seção baixar arquivos de seu site. Será necessário a instalação do .NET framework 2.0. Como ele é um proxy, pode ser usado por diversos programas clientes, como os navegadores Internet Explorer e o Firefox.

Existe um vídeo introdutório excelente sobre o Fiddler, que pode ser baixado neste endereço:
http://www.fiddlertool.com/fiddler/help/video/FiddlerQuickStart.wmv

Este vídeo explica desde sua instalação até a utilização de diversos de seus recursos. De qualquer forma continuarei abaixo mostrando algumas de suas funcionalidades.

Depois de instalado o Fiddler poderá ser iniciado através no Internet Explorer, veja na imagem 1


Imagem 1 - Abrindo o Fiddler

Ao acionar o Fiddler da maneira acima é feito duas coisas, o programa é aberto e é configurado no Internet Explorer o proxy. E é assim que o fiddler funciona, como ele virou o proxy de nossa aplicação ele recebe todas as requisições e respostas feitas pelo Internet Explorer. Assim ele faz o log de TUDO que é trafegado. Veja a configuração do proxy na imagem 2:

Imagem 2 - Configuração do proxy no Internet Explorer

Agora vamos usar o Fiddler, ao requisitar um endereço, por exemplo este:
http://clienteweb.blogspot.com/2008/07/arquitetura-webhttp-parte-3.html

O Fiddler irá mostrar em seu painel esquerdo(Web Sessions) as diversas requisições/respostas feitas para recuperar os recursos daquela url. Pode não ser apenas uma única requisição/resposta porque um HTML pode ter internamente várias imagens ou hiperlinks para outros HTMLs e cada hiperlink é necessário fazer outras requisições.

Na imagem 3, estamos analisando a primeira requisição:


Imagem 3 - Analisando uma requisição no Fiddler

Veja que no painel da direita superior é possível ver os cabeçalhos da requisição, onde há informações como:
  • Método e recurso requisitado:
    GET /2008/07/arquitetura-webhttp-parte-3.html HTTP/1.1

  • Cultura e localização(Português Brasil):
    Accept-Language: pt-br

  • Navegador e versão:
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
No painel da direita inferior é possível ver os cabeçalhos da resposta, onde há informações como:
  • Protocolo e códigos de status, neste caso 200 é ok:
    HTTP/1.1 200 OK

  • Informaçõe do servidor:
    Server: GFE/1.3
Repare que nesta visão o Fiddler faz um tratamento das mensagens para formata-las, mas podemos também ver as mensagem sem nenhum tratamento, da forma como realmente foram trocadas, basta clicar na guia raw, conforme Imagem 4:

Imagem 4 - Analisando toda a requisição

Desta forma vemos que o cabeçalho de resposta e o HTML é separado apenas por caracteres como a quebra de linha.

O Fiddler então é um excelente programa para conhecer as diversas requisições feitas para requisitar um determinado recurso. Vale a pena fazer diversas requisições para ver como funciona requisições HTTPs, redirecionamentos, requisições de arquivos que estão em cache e por aí vai!

Caso queira, veja também a especificação do HTTP 1.1 e analise cabeçalho códigos de resposta. Isto é uma excelente oportunidade de praticar este tanto de teoria.

Referências:
http://www.fiddlertool.com/fiddler/
http://gmailblog.blogspot.com/2008/05/need-for-speed-path-to-faster-loading.html
http://www.w3.org/Protocols/rfc2616/rfc2616.html