Programação Na Web HyperText Transfer Protocol () 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) cliente servidor Página Web no écran 1 Pedido (GET ) Resposta MIME
Protocolo - Sintaxe <COMMAND> <URL> /1.X <crlf> { <Header>: <Value> <crlf>}* <crlf> [<data>] Sintaxe Exº GET /docu2.html /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: montulli@www.cc.ukans.edu * a blank line * Sintaxe /1.X <result-code> [<message>] <crlf> { <Header>: <Value> <crlf>}+ <crlf> [<data>] Exº /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. Comandos Comandos sempre suportados GET HEAD POST pede uma página pede apenas o cabeçalho envia dados ao servidor Comandos nem sempre suportados PUT escreve uma página (inverso de GET) DELETE remove uma página LINK estabelece uma ligação entre páginas UNLINK remove uma ligação entre páginas
Códigos de resposta do servidor Tipos de códigos de retorno 2XX - códigos de OK 3XX - recolocação/redireccionamento 4XX - Erro no cliente 5XX - Erro no servidor Alguns exemplos 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 Cabeçalhos MIME Geral: informação não relacionada com a entidade a transferir Date: Tue, 15 Nov 1994 08:12:31 GMT MIME-Version: 1.0 Opções cliente: permite ao cliente passar informações acerca do pedido Accept: */* User-Agent: Lynx/2.2 libwww/2.14 From: montulli@www.cc.ukans.edu 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: informação sobre o servidor 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: informação sobre os dados entre cliente e servidor 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
Comando GET Pede um recurso (ficheiro, CGI, etc) Corpo sempre vazio Pedido: GET /index.html /1.1 Connection: Keep-Alive User-Agent: Mozilla/2.02Gold (WinNT; I) Host: www.ora.com Accept: image/gif, image/x-xbitmap, image/jpeg Resposta: /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... Exemplo: GET bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. GET /~davereed/index.html /1.1 Host: www.creighton.edu /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 </HTML>
Exemplo: GET Condicional bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. GET /~davereed/ /1.1 Host: www.creighton.edu If-Modified-Since: Wed, 5 Sep 2001 14:00:00 GMT /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) 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 Pedido: HEAD /index.html /1.1 Host: www.deec.isel.pt Resposta: /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
Exemplo: HEAD bluejay> telnet www.creighton.edu 80 Trying... Connected to parrot.creighton.edu. Escape character is '^]'. HEAD /~davereed/index.html /1.1 Host: www.creighton.edu servidor não envia a página, envia o cabeçalho /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 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 /1.1 Accept: */* User-Agent: Lynx/2.2 libwww/2.14 From: grobe@www.cc.ukans.edu 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%20grobe@kuhub.cc.ukans.edu 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 grobe@kuhub.cc.ukans.edu </ul>
Cookies O que são Cookies? Mecanismo que permite a aplicações 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 Sintaxe dos Headers referentes aos Cookies Set- Cookie: : {<NAME>=<VALUE>;}+ [expires=<date>;] [path=<path>;] [domain=<domain_name[ domain=<domain_name>;] [secure[ secure] <DATE> -> Wdy, DD-Mon-YYYY HH:MM:SS GMT Cookie: : {<NAME>=<VALUE>;}+
Algumas notas sobre Cookies Uma resposta 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. 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 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 tiver headers Cookie, estes deverão ser propagados por um proxy, independentemente de ser im pedido condicional (If-modofied-since) ou não.
Exemplos de transacções com Cookies (1) Cliente envia um pedido e recebe a resposta: Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=wednesday, 09-May- 1999 23:00:00 GMT (2) Cliente envia um pedido na path / : Cookie: CUSTOMER=WILE_E_COYOTE (3) Servidor envia resposta Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/ (4) Cliente envia um pedido na path / : Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 (5) Servidor envia resposta Set-Cookie: SHIPPING=EDEX; path=/foo (6) Cliente envia um pedido na path / : 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