È un protocollo a livello di applicazione. Esso è di fatto l'insieme di due applicazioni :
Durante una sessione GET/PUT del protocollo HTTP, viene aperta una sola connessione TCP/IP, che inizia con l'invio del comando di GET (da parte del client) e termina alla fine del comando di PUT (da parte del server).
Il modo migliore per imparare come funziona il protocollo HTTP è vedere come funziona uno script CGI.
Possiamo suddividere in 4 fasi una sessione request-response immaginando di compiere una usuale operazione di invio di un form e di ritorno dei risultati elaborati dal CGI sulla base dei dati contenuti nel form:
Una particolare attenzione va dedicata agli header HTTP.
Con essi è possibile informare il browser su quanto l'applicazione CGI (il server, solo "di sponda") gli sta per dare in pasto e su come deve comportarsi nei riguardi del documento in arrivo (ad esempio sul comportamento della cache).
Nella tabella seguente sono elencati gli header HTTP correntemente supportati dai browser commerciali.
| Header | Descrizione |
|---|---|
| Content-length | La lunghezza in byte del flusso (stream) di output. |
| Content-type | Il tipo MIME del contenuto dello stream di output |
| Expires | La data e l'ora dopo le quali il documento ricevuto dal client scade; dopo tale tempo, il documento non deve più essere caricato dalla cache ma deve essere richiesto al server. |
| Location | Redirezione del server: il CGI indica al server il documento da inviare al browser: il browser allora lo prende dal file system locale e lo invia al client. |
| Pragma | Commuta lo stato della direttiva di caching del documento inviato al client: se è ON il browser può salvare in cache il documento, altrimenti non lo farà. |
| Status | Stato della request. Il CGI (o il server direttamente) inviano al client un codice per segnalare le possibili eventualità. Vedi avanti un elenco degli Status codificati. |
| Refresh | Il client richiederà al server di ricaricare il documento. |
| Set-Cookie | Viene inviato un cookie (biscotto) al client. Questo è un metodo molto usato per tenere traccia di quale browser sta colloquiando con il server tra una richiesta e l'altra. |
Per una lista completa degli header HTTP, fare riferimento al sito del Web Consortium.
Un esempio di script Perl che invia in standard output al server HTTP uno stream corretto è il seguente:
#!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<html>", "\n" print "<head><title>Semplice documento HTML generato dallo script", "\n" print "<body>", "\n" print "<h1>", "Documento virtuale", "</h1>", "<hr>", "\n" print "</body></html>", "\n" exit(0); |
Un paio di regole per l'invio degli header:
È il tipo MIME del documento inviato; esso può assumere i valori "image/gif" come "text/plain" o "text/html".
Di solito il browser invia assieme ai dati del form anche un elenco dei tipi che può supportare. Questa informazione il server la salva nella variabile d'ambiente "HTTP_ACCEPT" che può essere letta dal CGI per stabilire se può o meno inviare un documento di un certo tipo.
Può essere utile per dire in anticipo al server la lunghezza del documento in byte in do tale da intercettare eventuali errori di trasmissione tra CGI e server (ad es. caratteri di EOF spuri).
Si usa nel caso in cui il risultato del CGI debba essere una redirezione del server ad un altro documento (in tal caso il CGI non fa praticamente nulla!)
Esempio:
#!/usr/local/bin/perl print "Location: thanks.html", "\n\n"; exit(0); |
In questo caso, il CGI dirà al server di pigliare il file thanks.html e di spedirlo al client.
Entrambi informano il browser sul fatto che esso possa utilizzare o meno la cache. Se vogliamo che un documento non possa essere salvato in cache ma richiesto ogni volta al server (ad esempio le pagine seguenti una sessione di login che non debbono essere viste se non dall'utente autenticato e solo in quel momento) abbiamo due modi alternativi:
print "Pragma: no-cache", "\n\n";
oppure
print "Expires: Monday, 25-Mar-97 05:29:10 GMT", "\n\n"
| Anche i browser possono richiedere al server la stessa cosa:
occorre specificare i tag <meta> a livello di
HTML header:
<meta http-equiv="expires" content="Monday, 25-Mar-97 05:29:10 GMT"> oppure <meta http-equiv="pragma" content="no-cache"> |
Il server o il CGI possono rispondere al browser con un codice nelle varie situazioni che vengono elencate in tabella
| Codice | Descrizione |
|---|---|
| 200 | Successo |
| 200 | Successo |
| 204 | No response |
| 301 | Document moved |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 500 | Internal server error |
| 501 | Not implemented |
Copyright @ 2000-2017 Marco Barbato htttp://www.betaingegneria.it

Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.