Protocollo HTTP
Il protocollo applicativo Hyper Text Transfer Protocol (HTTP) interscambia messaggi in codice ASCII a 7 bit tra un client e un server del protocollo.
I messaggi sono conformi ad uno standard TCP/IP, definito da una serie di documenti Request For Comments (RFC).
Struttura di un Messaggio
Ogni messaggio interscambiato ha:
- Testata del Messaggio
- Linea vuota separatrice
- Corpo del Messaggio - non sempre presente
Vi sono due tipi di messaggio:
- Richiesta - dal client al server
- Responso - dal server al client
Richiesta
La prima linea ha la struttura:
- Metodo - il tipo di processamento usato
- Risorsa - l'oggetto su cui il metodo opera
- HTTP/versione - l'identificativo del protocollo
Le linee seguenti sono headers della richiesta. Possono essere molte linee, una per ciascuno.
Uno header ha la struttura:
- Nome - singola parola, eventualmente contenente trattini separatori se più parole
- Due punti
- Valore - singolo, o più valori separati da virgole
Gli header consentiti sono tanti, parte dello standard. Server individuali possono avere un numero ridotto o esteso degli header accettati.
Responso
La prima linea ha la struttura:
- Codice di Stato
- Tipo Evento - corrispondente al codice
Seguono attributi, per la maggior parte informativi.
Gli attributi del responso hanno la stessa struttura sintattica di quelli della richiesta.
Tra alcuni attributi della richiesta e corrispondenti attributi del responso, è implementata una negoziazione di comportamenti, opzioni o features che il server può offrire.
Esempio di responso di successo:
Esempio di responso indicante fallimento:
Risorsa
E' l'identificativo di un oggetto su cui il server opera.
Formalmente, una URI (Uniform Resource Identifier) è l'intera stringa emessa dal browser, ed è divisa in due parti:
- la URL (Uniform Resource Locator), che indica come raggiungere e collegarsi al server
- la URN (Uniform Resource Name), la stringa che il server riceve nella prima linea della richiesta
Path
Nel caso più comune la parte path di un URN currisponde al percorso di un file al di sotto della directory principale di servizio pagine del server, la DocumentRoot.
La parte path di un URN non necessariamente corrisponde al percorso di un file, ma può essere un alias.
Il server trasforma il path iniziale in una stringa finale, detta route.
Un route specifico invoca uno handler, una funzione specifica che la elabora, o un programma esterno che viene in tal caso invocato ed esegue. Tale funzione o programma riceve come argomenti la richiesta in read-only e il responso in read-write. Legge, interpreta ed usa la richiesta, scrive il responso.
Query
I dati della richiesta possono essere:
- presenti nel URN della testata, come parte query, se il metodo è
GET
- presenti nel corpo se il metodo è
POST
Se i dati sono nella testata (GET
) seguono le regole di costruzione stringa dette URL Encoding:
=
assegna un valore ad una variabile&
separa due assegnazioni+
rappresenta uno spazio- qualsiasi altro carattere è rappresentato come
%xx
ovexx
è il codice esadecimale del carattere nella tabella US ASCII
Se i dati sono nel corpo della richiesta, possono essere in un formato qualsiasi, naturalmente compreso dallo handler.
Un formato di rappresentazione dati molto usato è JSON - JavaScript Object Notation.
Fragment
Non è inviato al server ma processato dal client, in vari modi, spesso ollegati col tipo MIME della richiesta.
Metodi HTTP
Metodo | Azione |
---|---|
GET | Trasferisce in download nel corpo la risorsa specificata dal server al client |
HEAD | Responso identico a GET nello header, ma senza il dowload dell'oggetto |
POST | Trasferisce in upload il contenuto del corpo ad un programma di processamento sul server |
PUT | Trasferisce in upload il contenuto del corpo alla risorsa specificata, creandola o rimpiazzandola |
DELETE | Cancella dal server la risorsa specificata |
CONNECT | Crea un tunnel tramite un proxy server con una destinazione finale specificata come risorsa |
OPTIONS | Richiede i metodi disponibili per la risorsa specificata |
TRACE | Compie un echo della richiesta nel responso, per debugging |
PATCH | Compie una modifica parziale alla risorsa, con le istruzioni contenute nel corpo |
Esempio di Metodi HTTP
Richiesta GET
Richiesta HEAD
Richiesta PUT
Molti server non implementano la richiesta PUT: Problemi di Sicurezza
Codici di Stato HTTP
Mantenuti da IANA (Internet Assigned Numbers Authority) sulla base di vari documenti RFC.
La prima cifra del codice indica il tipo di evento verificatosi:
Codice | Tipo Evento | Spiegazione |
---|---|---|
1xx | Informational Response | Richiesta ricevuta e il processamento continua |
2xx | Success | La richiesta è stata accettata |
3xx | Redirection | Richieste ulteriori azioni per completare la richiesta |
4xx | Client Error | Ra richiesta contiene errori e non viene accettata |
5xx | Server Error | La richiesta è valida ma il server non riesce ad eseguirla per varie ragioni |
La lista completa di codici di stato è lunga e qui vengono listati i codici più comuni:
Codice | Tipo Evento | Spiegazione |
---|---|---|
200 | Ok | Richiesta completata con successo e viene ritornato l'oggetto richiesto |
201 | Created | Un oggetto è stato creata con successo |
202 | Accepted | Richiesta accettata ma non ancora processata |
204 | No Content | Richiesta completata con successo, ma non è richiesto on oggetto di ritorno |
301 | Moved Permanently | Specifica una URL a cui la richiesta deve sempre rivolgersi |
302 | Found (Moved Temporarily) | Specifica una URL a cui la richiesta deve rivolgersi questa singola volta |
400 | Bad Request | Richiesta mal formata |
401 | Unauthorized | Non è stata fornita autenticazione |
403 | Forbidden | Autenticazione errata o azione proibita dalle policy |
404 | Not Found | La risorsa richiesta non esiste |
405 | Method Not Allowed | Metodo di richiesta errato |
406 | Not Acceptable | Nessun metodo di negoziazione contenuto è disponibile |
407 | Proxy Authentication Required | Occorre prima l'autenticazione col proxy |
408 | Request Timeout | Troppo tempo per terminare la richiesta |
414 | URI Too Long | La URL di un GET è troppo lunga ed occorre usare un POST |
417 | Expectation Failed | Specifico tipo dello header Expect non è disponibile |
418 | I'm A Teapot | Uovo di Pasqua a volte usato invece di 403 Forbidden |
429 | Too Many Requests | Ecceduto il limite quando vi è un meccanismo di rate limiting |
451 | Unavailable For Legal Reasons | Accesso negato per motivi legali (da Fahrenheit 451) |
500 | Internal Server Error | Errore generico del server, non specificato |
501 | Not Implemented | Il server non conosce correntemente come processare la richiesta |
502 | Bad Gateway | Il server è un proxy e non riesce a contattare la destinazione |
503 | Service Unavailable | Indisponibilità temporanea del servizio |
504 | Gateway Timeout | Il server è un proxy ed è andato in timeout |
Vi sono svariati altri codici ufficiali del protocollo.
Vi sono anche codici non ufficiali, usati in specifiche implementazioni del server. Per esempio:
Codice | Tipo Evento | Server | Spiegazione |
---|---|---|---|
218 | This is fine | Apache | Errore in combinazione col settaggio ProxyErrorOverride |
420 | Method Failure | Spring | Fallimento di un metodo Java invocato |
430 | Shopify Security Rejection | Shopify | Errore di sicurezza |
440 | Login Time-out | Microsoft | Sessione scaduta |
450 | Blocked by Windows Parental Controls | Microsoft | Bloccato dal controllo parentale |
494 | Request header too large | Nginx | La testata della richiesta è troppo grossa |
495 | SSL Certificate Error | Nginx | Il certificato cliente è invalido |
496 | SSL Certificate Required | Nginx | Occorre un certificato cliente |
497 | HTTP Request Sent to HTTPS Port | Nginx | Protocollo di richiesta errato |
509 | Bandwidth Limit Exceeded | Apache | Superato il limite di banda |
La Specifica CGI
Common Gateway Interface:
- Il client invia dati al server
- Dati spesso generati da un FORM
- Il Server attiva un programma esterno
- Il programma riceve in input i dati del client
- Metodi GET e POST
- Il programma esegue
- p.es. Query di Database
- Il programma genera in output una pagina HTML
- La pagina viene inviata al client
Il Metodo GET
Il Metodo POST
Server Side Includes
Comandi inseriti nel testo HTML, scanditi ed eseguiti dal server prima dell’invio pagina:
- Inclusi in commenti e preceduti da ‘#’
- Il server deve tipicamente essere abilitato a scandire le pagine contenenti SSI
- Le pagine contenenti SSI possono avere l'estensione
.shtml
Esempi: