Programação Na Web HyperText Transfer Protocol (HTTP) António Gonçalves Arquitectura • Protocolo de transporte de documentos hypertexto – RFC 1945 - Versão 1.0 – RFC 2616 - Versão 1.1 • O pedido é feito em ASCII e a resposta é do tipo MIME (RFC 822 e rfcs 2045, 2046, 2047, 2048, 2049) • O servidor não mantém estado dos clientes (stateless) • Servidor recebe pedidos normalmente em TCP-IP (porto 80) servidor cliente Página Web no écran 1 Pedido HTTP (GET …) Resposta MIME HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Protocolo HTTP - Sintaxe Sintaxe Sintaxe <COMMAND> <URL> HTTP/1.X <crlf> { <Header>: <Value> <crlf>}* <crlf> [<data>] HTTP/1.X <result-code> [<message>] <crlf> { <Header>: <Value> <crlf>}+ <crlf> [<data>] Exº Exº GET /docu2.html HTTP/1.1 Accept: text/plain; text/html; image/gif, *.* User-Agent: Mozilla4.0 (compatible; MSIE 5.0; Windows NT; Dig Ext) Host: www.abc.pt From: [email protected] * a blank line * HTTP/1.1 200 OK Date: Wednesday, 02-Feb-98 15:04:12 GMT Server: Apache1.3.6 (Unix) (Red Hat Linux) MIME-version: 1.0 Last-modified: Monday, 15-Nov-93 23:33:16 GMT Content-type: text/html Content-length: 2345 * a blank line * <HTML><HEAD><TITLE> . . . </TITLE> . . .etc. HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Comandos HTTP Comandos sempre suportados Comandos nem sempre suportados HTTP GET HEAD POST PUT DELETE LINK UNLINK pede uma página pede apenas o cabeçalho envia dados ao servidor escreve uma página (inverso de GET) remove uma página estabelece uma ligação entre páginas remove uma ligação entre páginas http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Códigos de resposta do servidor Tipos de códigos de retorno Alguns exemplos 2XX - códigos de OK 3XX - recolocação/redireccionamento 4XX - Erro no cliente 5XX - Erro no servidor 200 OK 201 Criado 204 Sem conteúdo 304 Não modificado 400 Pedido mal formado 401 Não tem autorização 501 Comando não implementado HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Cabeçalhos MIME • Geral: Geral informação não relacionada com a entidade a transferir – – • Opções cliente: cliente permite ao cliente passar informações acerca do pedido – – – – – • Accept: */* User-Agent: Lynx/2.2 libwww/2.14 From: [email protected] If-Modified-Since: Thu, 25 Sep 1997 15:01:26 GMT Cookie:EGSOFT_ID=193.137.220.2-640807376.29152144; expires=Fri, 31-Dec-1997 0:00:00 GMT;path=/ Resposta: Resposta informação sobre o servidor – – • Date: Tue, 15 Nov 1994 08:12:31 GMT MIME-Version: 1.0 Server: Apache/1.2b7 Set-Cookie: EGSOFT_ID=193.137.220.2-640807376.29152144; expires=Fri, 31-Dec-1997 0:00:00 GMT;path=/ Entidade: Entidade informação sobre os dados entre cliente e servidor – – – – HTTP Last-Modified: Thu, 25 Sep 1997 15:01:26 GMT Content-Length: 6575 Content-Type: text/html Expires: Thu, 25 Sep 1997 15:01:26 GMT http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Comando GET • Pede um recurso (ficheiro, CGI, etc) • Corpo sempre vazio Resposta: Pedido: GET /index.html HTTP/1.1 Connection: Keep-Alive User-Agent: Mozilla/2.02Gold (WinNT; I) Host: www.ora.com Accept: image/gif, image/x-xbitmap, image/jpeg HTTP HTTP/1.1 200 Document follows Date: Fri, 20 Sep 1996 08:17:58 GMT Server: NCSA/1.5.2 Last-modified: Mon, 17 Jun 1996 21:53:08 GMT Content-type: text/html Content-length: 2482 ... corpo do documento ... http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Exemplo: GET bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. GET /~davereed/index.html HTTP/1.1 Host: www.creighton.edu HTTP/1.1 200 OK Date: Wed, 23 Jan 2002 20:29:50 GMT Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10 Last-Modified: Tue, 22 Jan 2002 06:52:39 GMT ETag: "a9260-18a-39b49837" Accept-Ranges: bytes Content-Length: 394 Content-Type: text/html <HTML> <!--- Dave Reed index.html 1/22/02 --> <!---------------------------------------------------> <HEAD> <TITLE>Dave Reed's Home Page</TITLE> <SCRIPT LANGUAGE="JavaScript"> if (self!=top) top.location.href=self.location.href; </SCRIPT> </HEAD> <FRAMESET COLS="170,*"> <FRAME SRC="menu.html" NAME="menu"> <FRAME SRC="info.html" NAME="main"> </FRAMESET> Resposta do Servidor HTTP </HTML> http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Exemplo: GET Condicional bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. GET /~davereed/ HTTP/1.1 Host: www.creighton.edu If-Modified-Since: Wed, 5 Sep 2001 14:00:00 GMT HTTP/1.1 304 Not Modified Date: Wed, 23 Jan 2002 20:36:55 GMT Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10 ETag: "a9260-18a-39b49837" uma vez que o documento não foi modificado desde a data indicada, a página não é enviada pelo servidor (status code 304) HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm HEAD • Pedido de informações sobre o documento e não o documento em si. – Data da ultima modificação, dimensão, tipo, etc. • Corpo sempre vazio Resposta: Pedido: HEAD /index.html HTTP/1.1 Host: www.deec.isel.pt HTTP HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Tue, 10 Nov 1998 16:52:11 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Mon, 29 Dec 1997 01:55:11 GMT ETag: "10e93cccfc13bd1:37f9" Content-Length: 2604 http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Exemplo: HEAD bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. HEAD /~davereed/index.html HTTP/1.1 Host: www.creighton.edu servidor não envia a página, envia o cabeçalho HTTP/1.1 200 OK Date: Wed, 23 Jan 2002 20:54:23 GMT Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1 mod_fastcgi/2.2.10 Last-Modified: Tue, 22 Jan 2002 06:52:39 GMT ETag: "a9260-18a-39b49837" Accept-Ranges: bytes Content-Length: 394 Content-Type: text/html HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm POST • O cliente envia dados ao servidor no pedido (no corpo) • O conteúdo do pedido é passado à aplicação que processa os dados Pedido: POST /cgi-bin/post-query HTTP/1.1 Accept: */* User-Agent: Lynx/2.2 libwww/2.14 From: [email protected] Content-type: application/x-www-form-urlencoded Content-length: 150 Host: www.isel.pt org=Academic%20Computing%20Services &users=10000 &browsers=lynx &browsers=cello &browsers=mosaic &others=MacMosaic%2C%20WinMosaic &contact=Michael%20Grobe%[email protected] HTTP Resposta: Content-type: text/html <H1>Query Results</H1> You submitted the following name/value pairs: <ul> <li>org = Academic Computing Services <li>users = 10000 <li>browsers = cello <li>browsers = lynx <li>browsers = xmosaic <li>others = Mac Mosaic, Win Mosaic <li>contact = Michael Grobe [email protected] </ul> http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Cookies HTTP • O que são Cookies? – Mecanismo que permite a aplicações HTTP servidoras guardar e obter informações sobre o cliente. – Manutenção de informação de estado sobre o cliente. • Que informação contém um Cookie – Informação sobre o estado do cliente, do ponto de vista do servidor. – ‘Range’ de URLs para o qual o estado é válido HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Sintaxe dos Headers HTTP referentes aos Cookies Set- Cookie: ookie: {<NAME>=<VALUE>;}+ [expires=<DATE>;] [path=<PATH>;] >;] [secure path=<PATH>;] [domain=<DOMAIN_NAME [domain=<DOMAIN_NAME>;] [secure]] <DATE> -> Wdy, DD-Mon-YYYY HH:MM:SS GMT Cookie: Cookie: {<NAME>=<VALUE>;}+ HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Algumas notas sobre Cookies • Uma resposta HTTP pode conter múltiplos Set-Cookie • Instancias com a mesma ‘path’ e nome, são rescritas tendo precedência a ultima delas. – Instancias da mesma ‘path’ mas com nomes diferentes, são adicionados ao conjunto. • Definindo um Cookie com uma ‘path’ mais genérica, não remove Cookies com ‘paths’ mais específicas. – São enviados todos os mapeamentos para um Cookie, mesmo com ‘paths’ diferentes – Quando enviados para o servidor, os cookies com ‘path’ mais específica deverão ser enviados primeiro. • O campo expires indica ao cliente quando o Cookie deve ser removido. – No entanto o cliente não é obrigado a removê-lo. – O cliente pode remover o Cookie antes deste expirar se o número de cookies exceder os limites internos do cliente. HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Algumas notas sobre Cookies • Limites mínimos para o número de Cookies que um cliente pode guardar de cada vez. – 300 Cookies no total – 4 Kb por Cookie – 20 Cookies por domínio • Para uma aplicação servidora apagar um Cookie no cliente, deverá enviar na resposta um Cookie com o mesmo nome e uma data de expiração passada. • Os proxys HTTP não deverão fazer cache dos headers ‘Set-Cookie’ • Se um proxy receber um header ‘Set-Cookie’ deverá propaga-lo para o cliente independentemente do código de resposta ser 304 (Não modificado) ou 200 (Ok) • Da mesma forma se um pedido HTTP tiver headers Cookie, estes deverão ser propagados por um proxy, independentemente de ser im pedido condicional (If-modofied-since) ou não. HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm Exemplos de transacções HTTP com Cookies • (1) Cliente envia um pedido e recebe a resposta: – Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-May1999 23:00:00 GMT • (2) Cliente envia um pedido na path ‘/’: • (3) Servidor envia resposta • (4) Cliente envia um pedido na path ‘/’: – Cookie: CUSTOMER=WILE_E_COYOTE – Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/ – Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 • (5) Servidor envia resposta • (6) Cliente envia um pedido na path ‘/’: – Set-Cookie: SHIPPING=EDEX; path=/foo – Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 • (7) Cliente envia um pedido na path ‘/foo’: – Cookie: SHIPPING=EDEX; CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 HTTP http://ltodi.est.ips.pt/leonardo/ci/M aterialA poio.htm