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

Http-msg

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:

Resp01

Esempio di responso indicante fallimento:

Resp02

Risorsa

Struct-uri

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 ove xx è 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

MetodoAzione
GETTrasferisce in download nel corpo la risorsa specificata dal server al client
HEADResponso identico a GET nello header, ma senza il dowload dell'oggetto
POSTTrasferisce in upload il contenuto del corpo ad un programma di processamento sul server
PUTTrasferisce in upload il contenuto del corpo alla risorsa specificata, creandola o rimpiazzandola
DELETECancella dal server la risorsa specificata
CONNECTCrea un tunnel tramite un proxy server con una destinazione finale specificata come risorsa
OPTIONSRichiede i metodi disponibili per la risorsa specificata
TRACECompie un echo della richiesta nel responso, per debugging
PATCHCompie una modifica parziale alla risorsa, con le istruzioni contenute nel corpo

Esempio di Metodi HTTP

Richiesta GET

Http-get

Richiesta HEAD

Http-head

Richiesta PUT

Http-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:

CodiceTipo EventoSpiegazione
1xxInformational ResponseRichiesta ricevuta e il processamento continua
2xxSuccessLa richiesta è stata accettata
3xxRedirectionRichieste ulteriori azioni per completare la richiesta
4xxClient ErrorRa richiesta contiene errori e non viene accettata
5xxServer ErrorLa 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:

CodiceTipo EventoSpiegazione
200OkRichiesta completata con successo e viene ritornato l'oggetto richiesto
201CreatedUn oggetto è stato creata con successo
202AcceptedRichiesta accettata ma non ancora processata
204No ContentRichiesta completata con successo, ma non è richiesto on oggetto di ritorno
301Moved PermanentlySpecifica una URL a cui la richiesta deve sempre rivolgersi
302Found (Moved Temporarily)Specifica una URL a cui la richiesta deve rivolgersi questa singola volta
400Bad RequestRichiesta mal formata
401UnauthorizedNon è stata fornita autenticazione
403ForbiddenAutenticazione errata o azione proibita dalle policy
404Not FoundLa risorsa richiesta non esiste
405Method Not AllowedMetodo di richiesta errato
406Not AcceptableNessun metodo di negoziazione contenuto è disponibile
407Proxy Authentication RequiredOccorre prima l'autenticazione col proxy
408Request TimeoutTroppo tempo per terminare la richiesta
414URI Too LongLa URL di un GET è troppo lunga ed occorre usare un POST
417Expectation FailedSpecifico tipo dello header Expect non è disponibile
418I'm A TeapotUovo di Pasqua a volte usato invece di 403 Forbidden
429Too Many RequestsEcceduto il limite quando vi è un meccanismo di rate limiting
451Unavailable For Legal ReasonsAccesso negato per motivi legali (da Fahrenheit 451)
500Internal Server ErrorErrore generico del server, non specificato
501Not ImplementedIl server non conosce correntemente come processare la richiesta
502Bad GatewayIl server è un proxy e non riesce a contattare la destinazione
503Service UnavailableIndisponibilità temporanea del servizio
504Gateway TimeoutIl 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:

CodiceTipo EventoServerSpiegazione
218This is fineApacheErrore in combinazione col settaggio ProxyErrorOverride
420Method FailureSpringFallimento di un metodo Java invocato
430Shopify Security RejectionShopifyErrore di sicurezza
440Login Time-outMicrosoftSessione scaduta
450Blocked by Windows Parental ControlsMicrosoftBloccato dal controllo parentale
494Request header too largeNginxLa testata della richiesta è troppo grossa
495SSL Certificate ErrorNginxIl certificato cliente è invalido
496SSL Certificate RequiredNginxOccorre un certificato cliente
497HTTP Request Sent to HTTPS PortNginxProtocollo di richiesta errato
509Bandwidth Limit ExceededApacheSuperato 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

Cgi-get

Il Metodo POST

Cgi-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:

Http-ssi