Cabeçalhos do protocolo HTTP2011-2012Metodologias de Programação IV
Mensagem dopedido HTTP(Porto 80 de TCP)Cliente HTTP(por ex.,o navegador)Servidor HTTP(Apache, IIS, etc.)Mensagem daresposta HTTP
Mensagens do HTTPPedidoLinha de pedido CRLFLinhas de cabeçalhos CRLFCRLFCorpoRespostaLinha de estado CRLFLinhas de cabeçalhos CRLFCRLFCorpo
Pedido HTTPGET /tc/home.html HTTP/1.1Host: www.tribunalconstitucional.pt...
Resposta HTTPHTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 9934...
Lista total de cabeçalhos:Vamos ver alguns exemplosHypertextTransferProtocol -- 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 estático?Quem define (mete) os cabeçalhos das respostas de conteúdo dinâmico?
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&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p></BODY></HTML>No servidor (resposta)
<% Response.AddHeader "CustomHeader", "CustomValue" %><HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p></BODY></HTML>No servidor (resposta)
<HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>Isto pode funcionar?
Navegador pede a páginaServidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor vai enviando o corpo da páginaServidor executa o código e cria mais corpo
Quando chega ao código, já se acabaram os cabeçalhos e já começou a ser enviado o corpo da resposta...<HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
Mas há servidores que implementam buffering da resposta:Browser pede a páginaServidor vai criando a resposta em memória intermédia (buffer)Servidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor executa o código e cria mais corpo
Mas há servidores que implementam buffering da resposta:Browser pede a páginaServidor vai criando a resposta em memória intermédia (buffer) até chegar ao fim do corpoServidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor executa o código e cria mais corpoServidor envia o conteúdo do buffer<% Response.Flush() %>
Com buffering activo no servidor (default no IIS 5.0 e mais recentes), isto funciona<HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
Leituras associadasWeb ApplicationArchitecture, Second EditionCap. 3: “Birth of theWeb: HTTP”, págs. 44 a 60.HypertextTransferProtocol -- HTTP/1.1http://www.w3.org/Protocols/rfc2616/rfc2616.html
Tipos mime no protocolo httpPróxima secção

Metodologias de Programação IV - Aula 3, Secção 1 - Cabeçalhos do protocolo HTTP

  • 1.
    Cabeçalhos do protocoloHTTP2011-2012Metodologias de Programação IV
  • 2.
    Mensagem dopedido HTTP(Porto80 de TCP)Cliente HTTP(por ex.,o navegador)Servidor HTTP(Apache, IIS, etc.)Mensagem daresposta HTTP
  • 3.
    Mensagens do HTTPPedidoLinhade pedido CRLFLinhas de cabeçalhos CRLFCRLFCorpoRespostaLinha de estado CRLFLinhas de cabeçalhos CRLFCRLFCorpo
  • 4.
    Pedido HTTPGET /tc/home.htmlHTTP/1.1Host: www.tribunalconstitucional.pt...
  • 5.
    Resposta HTTPHTTP/1.1 200OKContent-Type: text/htmlContent-Length: 9934...
  • 9.
    Lista total decabeçalhos:Vamos ver alguns exemplosHypertextTransferProtocol -- HTTP/1.1http://www.w3.org/Protocols/rfc2616/rfc2616.html
  • 10.
    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
  • 11.
    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
  • 12.
    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
  • 13.
    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
  • 14.
    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
  • 15.
    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
  • 16.
    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
  • 17.
    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
  • 18.
    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
  • 19.
    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
  • 20.
    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
  • 21.
    Quem define (mete)os cabeçalhos dos pedidos?Quem define (mete) os cabeçalhos das respostas de conteúdo estático?Quem define (mete) os cabeçalhos das respostas de conteúdo dinâmico?
  • 22.
    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)
  • 23.
    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)
  • 24.
    <% Response.AddHeader "CustomHeader","CustomValue" %><HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p></BODY></HTML>No servidor (resposta)
  • 25.
    <% Response.AddHeader "CustomHeader","CustomValue" %><HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p></BODY></HTML>No servidor (resposta)
  • 26.
    <HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina temum cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>Isto pode funcionar?
  • 27.
    Navegador pede apáginaServidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor vai enviando o corpo da páginaServidor executa o código e cria mais corpo
  • 28.
    Quando chega aocódigo, já se acabaram os cabeçalhos e já começou a ser enviado o corpo da resposta...<HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
  • 29.
    Mas há servidoresque implementam buffering da resposta:Browser pede a páginaServidor vai criando a resposta em memória intermédia (buffer)Servidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor executa o código e cria mais corpo
  • 30.
    Mas há servidoresque implementam buffering da resposta:Browser pede a páginaServidor vai criando a resposta em memória intermédia (buffer) até chegar ao fim do corpoServidor cria a resposta, excepto corpoServidor vai lendo o ficheiro da páginaServidor copia o conteúdo do ficheiro para o corpo<% %>?NãoSimServidor executa o código e cria mais corpoServidor envia o conteúdo do buffer<% Response.Flush() %>
  • 31.
    Com buffering activono servidor (default no IIS 5.0 e mais recentes), isto funciona<HTML><TITLE>Teste</TITLE><BODY><p>Esta p&aacute;gina tem um cabe&ccedil;alhoHTTP personalizado</p><% Response.AddHeader "CustomHeader", "CustomValue" %></BODY></HTML>
  • 32.
    Leituras associadasWeb ApplicationArchitecture,Second EditionCap. 3: “Birth of theWeb: HTTP”, págs. 44 a 60.HypertextTransferProtocol -- HTTP/1.1http://www.w3.org/Protocols/rfc2616/rfc2616.html
  • 33.
    Tipos mime noprotocolo httpPróxima secção