O documento descreve os protocolos e cabeçalhos HTTP, incluindo como mensagens de pedido e resposta são estruturadas e quais cabeçalhos são comuns. Explica também como cabeçalhos personalizados podem ser adicionados em respostas dinâmicas no servidor.
3. Mensagens do HTTP Pedido Linha de pedido CRLF Linhas de cabeçalhos CRLF CRLF Corpo Resposta Linha de estado CRLF Linhas de cabeçalhos CRLF CRLF Corpo
4. Pedido HTTP GET /tc/home.html HTTP/1.1 Host: www.tribunalconstitucional.pt ...
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ágina tem um cabeçalho HTTP personalizado</p> </BODY> </HTML> No servidor (resposta)
25. <% Response.AddHeader "CustomHeader", "CustomValue" %> <HTML> <TITLE>Teste</TITLE> <BODY><p>Esta página tem um cabeçalho HTTP personalizado</p> </BODY> </HTML> No servidor (resposta)
26. <HTML> <TITLE>Teste</TITLE> <BODY><p>Esta página tem um cabeçalho HTTP personalizado</p> <% Response.AddHeader "CustomHeader", "CustomValue" %> </BODY> </HTML> Isto pode funcionar?
27. 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 <% %> ? Não Sim Servidor vai enviando o corpo da página Servidor executa o código e cria mais corpo
28. 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ágina tem um cabeçalho HTTP personalizado</p> <% Response.AddHeader "CustomHeader", "CustomValue" %> </BODY> </HTML>
29. Mas há servidores que implementam buffering da resposta: Browser pede a página Servidor vai criando a resposta em memória intermédia (buffer) Servidor cria a resposta, excepto corpo Servidor vai lendo o ficheiro da página Servidor copia o conteúdo do ficheiro para o corpo <% %> ? Não Sim Servidor executa o código e cria mais corpo
30. Mas há servidores que implementam buffering da resposta: Browser pede a página Servidor vai criando a resposta em memória intermédia (buffer) até chegar ao fim do corpo Servidor cria a resposta, excepto corpo Servidor vai lendo o ficheiro da página Servidor copia o conteúdo do ficheiro para o corpo <% %> ? Não Sim Servidor executa o código e cria mais corpo Servidor envia o conteúdo do buffer <% Response.Flush() %>
31. Com buffering activo no servidor (default no IIS 5.0 e mais recentes), isto funciona <HTML> <TITLE>Teste</TITLE> <BODY><p>Esta página tem um cabeçalho HTTP personalizado</p> <% Response.AddHeader "CustomHeader", "CustomValue" %> </BODY> </HTML>
32. Leituras associadas Web ApplicationArchitecture, Second Edition Cap. 3: “Birth of theWeb: HTTP”, págs. 44 a 60. HypertextTransferProtocol -- HTTP/1.1 http://www.w3.org/Protocols/rfc2616/rfc2616.html