metodologias de programação iv - aula 3, secção 1 - cabeçalhos do protocolo http
TRANSCRIPT
Cabeçalhos do protocolo HTTP
2011-2012
Metodologias de Programação IV
Cliente HTTP(por ex.,
o navegador)
Servidor HTTP(Apache, IIS,
etc.)
Mensagem dopedido HTTP
(Porto 80 de TCP)
Mensagem daresposta HTTP
Mensagens do HTTP
PedidoLinha de pedido CRLFLinhas de cabeçalhos CRLFCRLFCorpo
RespostaLinha de estado CRLFLinhas de cabeçalhos CRLFCRLFCorpo
Pedido HTTP
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.pt...
Resposta HTTP
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 9934...
Lista total de cabeçalhos:
Vamos ver alguns exemplos
Hypertext Transfer Protocol -- HTTP/1.1http://www.w3.org/Protocols/rfc2616/rfc2616.html
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.ptDate: Tue, 30 Sep 2008 13:45:29 GMTUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3Referer: http://home.utad.pt/~leonelm/teste.htmIf-Modified-Since: Tue, 30 Sep 2008 13:40:29 GMT
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.ptDate: Tue, 30 Sep 2008 13:45:29 GMTUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3Referer: http://home.utad.pt/~leonelm/teste.htmIf-Modified-Since: Tue, 30 Sep 2008 13:40:29 GMT
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.ptDate: Tue, 30 Sep 2008 13:45:29 GMTUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3Referer: http://home.utad.pt/~leonelm/teste.htmIf-Modified-Since: Tue, 30 Sep 2008 13:40:29 GMT
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.ptDate: Tue, 30 Sep 2008 13:45:29 GMTUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3Referer: http://home.utad.pt/~leonelm/teste.htmIf-Modified-Since: Tue, 30 Sep 2008 13:40:29 GMT
GET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.ptDate: Tue, 30 Sep 2008 13:45:29 GMTUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3Referer: http://home.utad.pt/~leonelm/teste.htmIf-Modified-Since: Tue, 30 Sep 2008 13:40:29 GMT
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
HTTP/1.1 200 OKServer: Microsoft-IIS/4.0Date: Tue, 30 Sep 2008 13:45:38 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 06 Jan 1999 18:56:06 GMTContent-Length: 9934
Quem define (mete) os cabeçalhos dos pedidos?
Quem define (mete) os cabeçalhos das respostas de conteúdo dinâmico?
Quem define (mete) os cabeçalhos das respostas de conteúdo estático?
function ajax(url, vars, callbackFunction) { var request = new XMLHttpRequest(); request.open("POST", url, true); request.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded"); request.onreadystatechange = function() { if (request.readyState == 4 && request.status == 200) { if (request.responseText) { callbackFunction(request.responseText); } } }; request.send(vars);}
No navegador (pedido)
function ajax(url, vars, callbackFunction) { var request = new XMLHttpRequest(); request.open("POST", url, true); request.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded"); request.onreadystatechange = function() { if (request.readyState == 4 && request.status == 200) { if (request.responseText) { callbackFunction(request.responseText); } } }; request.send(vars);}
No browser (pedido)
<% Response.AddHeader "CustomHeader", "CustomValue" %><HTML><TITLE>Teste</TITLE><BODY><p>Esta página tem um cabeçalhoHTTP personalizado</p></BODY></HTML>
No servidor (resposta)
<% Response.AddHeader "CustomHeader", "CustomValue" %><HTML><TITLE>Teste</TITLE><BODY><p>Esta página tem um cabeçalhoHTTP personalizado</p></BODY></HTML>
No servidor (resposta)
<HTML><TITLE>Teste</TITLE><BODY><p>Esta página tem um cabeçalhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
Isto pode funcionar?
Navegador pede a página
Servidor cria a resposta, excepto corpo
Servidor vai lendo o ficheiro da página
<% %>?
Servidor copia o conteúdo do
ficheiro para o corpo
Servidor executa o código e cria mais corpo
Sim
Não
Servidor vai enviando o
corpo da página
<HTML><TITLE>Teste</TITLE><BODY><p>Esta página tem um cabeçalhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
Quando chega ao código, já se acabaram os cabeçalhos e já começou
a ser enviado o corpo da resposta...
Browser pede a página
Servidor cria a resposta, excepto
corpo
Servidor vai lendo o ficheiro da
página
<% %>?
Servidor copia o conteúdo do
ficheiro para o corpo
Servidor executa o código e cria mais
corpo
Sim
Não
Servidor vai criando a resposta em memória
intermédia (buffer)
Mas há servidores que implementam buffering da resposta:
Mas há servidores que implementam buffering da resposta:
Browser pede a página
Servidor cria a resposta, excepto
corpo
Servidor vai lendo o ficheiro da
página
<% %>?
Servidor copia o conteúdo do
ficheiro para o corpo
Servidor executa o código e cria mais
corpo
Sim
Não
Servidor vai criando a resposta em memória
intermédia (buffer) até chegar ao fim do corpo
Servidor envia o conteúdo do
buffer <% Response.Flush() %>
<HTML><TITLE>Teste</TITLE><BODY><p>Esta página tem um cabeçalhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
Com buffering activo no servidor (default no IIS 5.0 e mais recentes),
isto funciona
Leituras associadas
Web Application Architecture, Second EditionCap. 3: “Birth of theWeb: HTTP”, págs. 44 a 60.
Hypertext Transfer Protocol -- HTTP/1.1http://www.w3.org/Protocols/rfc2616/rfc2616.html
TIPOS MIME NO PROTOCOLO HTTPPróxima secção