HyperText Transfer Protocol
Norme utilisée par Up ! Content Service
La norme HyperText Transfer Protocol (HTTP) décrit comment envoyer un requête sur une ressource d'un client vers un serveur et comment répondre à celle-ci d'un serveur vers un client. Elle permet également de router une requête ou une réponse via des passerelles abusiment appelées proxy.
La communication est à l'initiative du client : il pose une requête sur une ressource et le serveur répond. Le port d'écoute du serveur est usuellement 80.
Une ressource est composée d'une ou plusieurs entités chacune identifiée par une étiquette.
Une requête ou une réponse sont constituées de :
- Une ligne de démarrage.
Encodée au format texte Ascii.
Pour une requête, elle comporte l'une des méthodes suivantes, suivie de l'Uniform Resource Identifier (URI) sur laquelle elle porte, suivi de la version du protocole utilisée :
- DELETE.
Suppression d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur.
- GET.
Envoi du serveur vers le client de l'en-tête et du contenu d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur. Dans ce dernier cas, le contenu doit être encapsulé dans une entité faisant partie du corps de la réponse.
L'envoi peut être conditionnel avec les commandes If-Match, If-Modified-Since, If-None-Match, If-Range ou If-Unmodified-Since qui sont expliquées plus loin.
- HEAD.
Envoi du serveur vers le client de l'en-tête seul d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur.
Pour une Uniform Resource Identifier (URI) donnée, l'en-tête est identique à celui de la réponse à la méthode GET.
- LINK.
Etablissement d'un lien entre des ressources. Cette méthode est facultative.
- OPTIONS.
Information sur les options de communication pour toutes les ressources ou spécifiques à une ressource.
- PATCH.
Mise à jour par le client d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur. Dans ce dernier cas, le contenu doit être encapsulé dans une entité faisant partie du corps de la requête.
Le corps contient la liste des parties de la ressource à mettre à jour ainsi que les contenus stricto sensu. Cette méthode est facultative.
- POST.
Envoi du client vers le serveur de l'en-tête et du contenu d'une entité d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur. Dans ce dernier cas, le contenu doit être encapsulé dans une entité faisant partie du corps de la requête.
- PUT.
Envoi du client vers le serveur de l'en-tête et du contenu d'une ressource statique - un fichier - ou gérée dynamiquement - via un module chargé dans le serveur. Dans ce dernier cas, le contenu doit être encapsulé dans une entité faisant partie du corps de la requête.
Il peut s'agir soit de la création ou soit de la mise à jour de la ressource.
- TRACE.
Teste de la communication entre le client et le serveur pour l'atteinte d'une ressource.
- UNLINK.
Suppression d'un lien entre des ressources. Cette méthode est facultative.
Pour une réponse, elle comporte la version du protocole utilisée, suivie du code retour suivi du texte qui lui est associé.
Un code retour 1xx ou 2xx traduit un bon fonctionnement. Un code retour 3xx traduit une demande d'information complémentaire. Un code retour 4xx ou 5xx traduit une erreur de fonctionnement.
- Un en-tête.
Encodé au format texte Ascii composé de lignes.
- Un séparateur.
Une ligne vide.
- Un corps optionnel.
Encodé au format texte ou binaire selon la définition posée dans l'en-tête.
Une ligne de l'en-tête d'une requête ou d'une réponse se compose d'une ou plusieurs lignes physiques d'au plus 70 caractères.
La première ligne physique commence par une commande suivie du caractère deux-points : . Les autres lignes commencent par un séparateur qui est soit un espace ou une tabulation \t.
Les lignes de la requête ou de la réponse sont terminées par les caractères saut de ligne \r et retour chariot \n.
Voici le format des données :
- Binaire.
Il est encodé avec un algorithme tel Base64.
- Caractère.
Il est écrit en deux caractères guillemets " .
- Date.
Son format est :
- Optionnellement, l'abréviation du jour dans la semaine suivi du caractère virgule , .
Mon, Tue, Wed, Thu, Fri, Sat et Sun. - Le numéro du jour dans le mois.
Entre 1 et 31. - L'abréviation du mois.
Jan, Fev, Mar, Avr, May, Jun, Jul, Aug, Sep, Oct, Nov et Dec. - L'année, suivie du caractère espace.
Sur quatre chiffres. - Les heures suivies du caractère deux-points : .
- Les minutes suivies.
- Optionnellement, les secondes suivis précédées du caractère deux-points : .
- Le code du fuseau horaire.
Voici un exemple : Sun, 1 Jan 2006 18:52:32 GMT
.
- Entier.
Il est écrit directement.
- Réel.
Il est écrit directement.
Commandes communes aux requêtes et aux réponses
Les commandes sont les suivantes :
- Cache-Control.
Liste des directives de gestion de l'anté-mémoire exigées par le client ou acceptées par le serveur.
Voici celles du client :
- max-age.
Le contenu ne doit pas plus agé que le nombre de secondes spécifié en paramètre. A défaut, une nouvelle occurrence du contenu doit être obtenue. - max-stale.
Le contenu ne peut plus être encore valide depuis le nombre de secondes passé en paramètre au regard de son âge. A défaut, une nouvelle occurrence du contenu doit être obtenue. - min-fresh.
Le contenu doit être encore valide dans le nombre de secondes passé en paramètre au regard de son âge. A défaut, une nouvelle occurrence du contenu doit être obtenue. - no-cache.
Le contenu ne doit pas être conservé dans une anté-mémoire. - no-store.
Le contenu ne doit pas être conservé dans une anté-mémoire qui est archivé. La durée de vie de l'anté-mémoire est donc celle du processus. - only-if-cached.
Le contenu est envoyé que s'il est présent dans une anté-mémoire.
Voici celles du serveur :
- max-age.
Le contenu ne doit pas plus agé que le nombre de secondes spécifié en paramètre. A défaut, une nouvelle occurrence du contenu doit être obtenue. - must-revalidate.
Le contenu doit être revalidé avant d'être utilisé i.e. le client ou le proxy doit le demander sans faire appel à ce qui a été conservé dans une anté-mémoire. - no-cache.
Le contenu ne doit pas être conservé dans une anté-mémoire. - no-transform.
Le contenu conservé dans une anté-mémoire ne doit pas être transformé. Par exemple, le format de l'image ne doit pas être converti de Bmp à Jpeg alors que cela prend moins de place. - private.
Le contenu doit être conservé dans une anté-mémoire propre à chaque utilisateur. - proxy-revalidate.
Le contenu doit être revalidé avant d'être utilisé i.e. le proxy doit le demander sans faire appel à ce qui a été conservé dans une anté-mémoire. - public.
Le contenu peut être conservé dans une anté-mémoire partagée par différents utilisateurs.
Voici un exemple : Cache-Control: max-age=3600, no-cache=<coucou>
.
- Connection.
Connexion non persistante. Voici un exemple : Connection: close
.
- Date.
Date à laquelle la requête ou la réponse a été produite.
- Pragma.
Directive obsolète de contrôle du cache provenant de la norme 1.0.
- Transfer-Encoding.
Encodage du corps de la requête ou de la réponse. Les valeurs usuelles sont :
- 7bit.
Le contenu est au format texte en Ascii sur 7 bits, avec des lignes limitées à 1000 caractères et terminées par \r\n. - 8bit.
Le contenu est au format texte en Ascii sur 8 bits, avec des lignes limitées à 1000 caractères et terminées par \r\n. - base64.
Le contenu est formaté selon l'algorithme base64. - binary.
Le contenu est au format binaire sur 8 bits, sans notion de ligne. - chunked.
Le contenu est tronconné avec une marque délimitant le début et la fin de chaque tronçon, comme pour les courriers électroniques formatés en multipart. - quoted-printable.
Le contenu est formaté selon l'algorithme quoted-printable.
- Upgrade.
Liste de protocoles que le client préfère utiliser si le serveur les supporte. Voici un exemple : Upgrade: HTTP/2.0
.
- Via.
Liste des passerelles ayant transmis la requête. Voici un exemple : Via: HTTP/1.0 www.up-comp.com
.
Commandes spécifiques aux requêtes
Les commandes sont les suivantes :
- Accept.
Liste des types de contenu acceptés par le client. Voici un exemple : Accept: text/plain; q=0.5, text/html
.
- Accept-Charset.
Liste des pages de codes acceptées par le client. Voici un exemple : Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
.
- Accept-Encoding.
Liste des encodages acceptés par le client. Voici un exemple : Accept-Encoding: deflate, gzip
.
- Accept-Language.
Liste des langues acceptées par le client. Voici un exemple : Accept-Language: fr;q=1, en;q=0.7
.
- Accept-Ranges.
Liste des unités d'intervalle acceptées par le client. Voici un exemple : Accept-Ranges: bytes
.
- Authorization.
Identification du client pour le serveur hébergant la ressource. Voici un exemple :Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
.
La chaîne d'identification consiste en l'encodage en Base64 de ${Utilisateur}:${MotDePasse}.
- From.
Adresse du courrier électronique du client. Voici un exemple : From: nom.prenom@mon-domaine.com
.
- Host.
Adresse et port du serveur ciblé par le client. Voici un exemple : Host: www.up-comp.com:80
.
- If-Match.
Teste si les étiquettes des entités correspondent à la liste des modèles passée en paramètre. Voici un exemple : If-Match: a", b", c"
.
Seules les entités pour lesquelles la réponse est Vrai sont affectées par la méthode.
- If-Modified-Since.
Teste si l'entité a été modifiée depuis la date passée en paramètre. Voici un exemple : If-Modified-Since: Sun, 1 Jan 2006 18:52:32 GMT
.
Si l'entité n'a pas été modifiée, seule la réponse 304 est retournée. Sinon, l'entité complète est retournée.
- If-None-Match.
Teste si les étiquettes des entités ne correspondent pas à la liste des modèles passée en paramètre. Voici un exemple : If-None-Match: a", b", c"
.
Seules les entités pour lesquelles la réponse est Vrai sont affectées par la méthode.
- If-Range.
Teste soit :
- L'existence d'une entité.
Le paramètre est alors son étiquette. Voici un exemple : If-Range: coucou"
.
La réponse est le contenu de l'entité si elle existe.
- La modification d'une entité.
Le paramètre est alors la date limite. Voici un exemple : If-Range: Sun, 1 Jan 2006 18:52:32 GMT
.
Si la ressource n'a pas été modifiée depuis cette date, seule l'entité est retournée. Sinon, toute la ressource est retournée.
- If-Unmodified-Since.
Teste si l'entité n'a pas été modifiée depuis la date passée en paramètre. Voici un exemple : If-Unmodified-Since: Sun, 1 Jan 2006 18:52:32 GMT
.
Si l'entité a été modifiée, seule la réponse 412 est retournée. Sinon, l'entité complète est retournée.
- Max-Forwards.
Nombre maximal de renvois pour la méthode TRACE. Voici un exemple : Max-Forwards: 10
.
- Proxy-Authorization.
Identification du client pour le proxy permettant d'accéder au serveur hébergant la ressource. Voici un exemple : Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
.
La chaîne d'identification consiste en l'encodage en Base64 de ${Utilisateur}:${MotDePasse}.
- Range.
Liste d'intervalles délimités par deux positions exprimées en octets. Les intervalles peuvent être ouvets. Voici un exemple : Range: bytes=100-199, 300-
.
- Referer.
Uniform Resource Identifier (URI) ayant mené le client à soumettre la requête au serveur. Il peut s'agir de la consultation d'un moteur de recherche ou d'un annuaire, d'un lien, etc. Voici un exemple : Referer: http://www.up-comp.com/index.html
.
- User-Agent.
Spécifie au serveur le logiciel ayant émis la requête. Voici un exemple : User-Agent: Up ! Application System/4.0.0
.
Commandes spécifiques aux réponses
Les commandes sont les suivantes :
- Age.
Age de la copie en cache de la ressource en secondes. Voici un exemple : Age: 3600
.
- Location.
Localisation de la ressource par son Uniform Resource Identifier (URI). Voici un exemple : Location: http://www.up-comp.com/demo/sample1.html
.
- Proxy-Authenticate.
Question secrète posée par le serveur au client pour une identification sécurisée. Voici un exemple :Proxy-Authenticate: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
.
- Public.
Liste des méthodes acceptées par le serveur pour les ressources. Voici un exemple : Public: GET, POST
.
- Retry-After.
Spécifie au client de soumettre ultérieurement sa requête en précisant soit un délai ou soit une date. Voici un exemple : Retry-After: Sun, 1 Jan 2006 18:52:32 GMT
.
- Server.
Spécifie au client le logiciel ayant traité la requête. Voici un exemple : Server: Up ! Application System/4.0.0
.
- Vary.
Spécifie au client les dimensions de l'entité. Cette information est obligatoire pour un contenu provenant de l'anté-mémoire. Voici un exemple : Vary: *
.
- Warning.
Liste des avertissements émis par le serveur sur la validité du contenu. Voici un exemple : Warning: 10 UpsAps Response is stale.
.
- WWW-Authenticate.
Liste de questions secrètes posées par le serveur au client pour une identification sécurisée. Voici un exemple :WWW-Authenticate: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
.
Commandes spécifiques aux entités
Les commandes sont les suivantes :
- Allow.
Liste des méthodes acceptées par le serveur pour les entités de la ressource. Voici un exemple : Allow: GET, POST
.
- Content-Base.
Chemin absolu pour résoudre les chemins relatifs de l'entité. Voici un exemple : Content-Base: http://www.up-comp.com/demo
.
- Content-Encoding.
Liste des encodages utilisés pour l'entité. Voici un exemple : Content-Encoding: gzip
.
- Content-Language.
Liste des langues utilisées pour l'entité. Voici un exemple : Content-Language: fr
.
- Content-Length.
Taille du corps de l'entité en octets. Voici un exemple : Content-Length: 1024
.
- Content-Location.
Uniform Resource Identifier (URI) de l'entité. Voici un exemple : Content-Location: sample1.html
.
- Content-MD5.
Message Digest 5 (MD5) de l'entité. Voici un exemple : Content-MD5: d174ab98d277d9f5a5611c2c9f419d9f
.
- Content-Range.
Intervalle délimité par deux positions exprimées en octets et taille totale de l'entité exprimées en octets. Voici un exemple : Content-Range: bytes 100-199/1000
.
- Content-Type.
Type du contenu de l'entité. Voici un exemple : Content-Type: text/html
.
- ETag.
Etiquette identifiant l'entité. Voici un exemple : ETag: coucou"
.
- Expires.
Date d'expiration de la validité de l'entité. Voici un exemple : Expires: Sun, 1 Jan 2006 18:52:32 GMT
.
- Last-Modified.
Date de dernière modification de l'entité. Voici un exemple : Last-Modified: Sun, 1 Jan 2006 18:52:32 GMT
.
Messages de HyperText Transfer Protocol
Messages de démarrage de la réponse
Voici les messages déclarés dans la norme :
100 Continue.
101 Switching Protocols.
200 OK.
201 Created.
202 Accepted.
203 Non-Authoritative Information.
204 No Content.
205 Reset Content.
206 Partial Content.
300 Multiple Choices.
301 Moved Permanently.
302 Moved Temporarily.
303 See Other.
304 Not Modified.
305 Use Proxy.
400 Bad Request.
401 Unauthorized.
402 Payment Required.
403 Forbidden.
404 Not Found.
405 Method Not Allowed.
406 Not Acceptable.
407 Proxy Authentication Required.
408 Request Time-out.
409 Conflict.
410 Gone.
411 Length Required.
412 Precondition Failed.
413 Request Entity Too Large.
414 Request-URI Too Large.
415 Unsupported Media Type.
500 Internal Server Error.
501 Not Implemented.
502 Bad Gateway.
503 Service Unavailable.
504 Gateway Time-out.
505 HTTP Version not supported.
Messages de la commande Warning
Voici les messages déclarés dans la norme :
10 Response is stale.
11 Revalidation failed.
12 Disconnected operation.
13 Heuristic expiration.
14 Transformation applied.
99 Miscellaneous warning.
Syntaxe d'une conversation au format HyperText Transfer Protocol
Conversation :
Requete :
Methode :
NomDeLaMethode :
DELETE
| GET
| HEAD
| LINK
| OPTIONS
| POST
| PATCH
| PUT
| TRACE
| UNLINK
;
URI :
ListeDeCommandesRequete :
CommandeRequete :
Reponse :
CodeRetour :
HTTP /
NumeroVersion .
NumeroRevision CodeRetour Description
;
CommandeReponse :
CommandeGenerale :
CommandeEntite :
ListeDeTypesContenu :
TypeContenu :
ListeDeProprietesOptionnelles :
ListeDeProprietes :
Propriete :
;
Propriete =
ValeurDeLaPropriete
;
ListeDEncodages :
Encodage :
compress
| deflate
| gzip
;
ListeDUnites :
Unite :
Identification :
Basic ChaineDIdentification
| none
;
NumeroPortOption :
ListeDeModeles :
ComparaisonFaibleOption :
SuiteIfRange :
Etiquette
| DateModification
;
ListeDIntervalles :
Intervalle :
BorneSuperieureOption :
| -
BorneSuperieureEnOctets
;
SuiteRetryAfter :
DateModification
| DelaiEnSecondes
;
ListeDeProduits :
Produit :
NomDuProduit /
VersionDuProduit
;
ListeDePasserelles :
Passerelle :
NomDuProduitOption :
ListeDAvertissements :
Avertissement :
NumeroCodeAvertissement Emetteur MessageDAvertissement
;
ListeDeChainesDIdentification :
Transformation :
base32
| base64
| chunked
| quoted-printable
;
ListeDeDirectives :
Directive :
DirectiveClient :
DirectiveServeur :
ListeDeChampsOption :
ListeDeChamps :
DureeEnSecondesOption :
ListeDeMethodes :
CorpsOptionnel :
ListeDeTroncons :
Troncon :
Exemple d'une conversation au format HyperText Transfer Protocol
Cette conversation ne concerne que le flux de contrôle. Voici la question :
http://www.up-comp.com/french/index.html GET 1.1\r\n
Cache-control: no-cache\r\n
Date: Sun, 1 Jan 2006 18:52:32 GMT\r\n
Accept: text/plain; q=0.5, text/html\r\n
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8\r\n
Accept-Encoding: deflate, gzip\r\n
Accept-Language: fr;q=1, en;q=0.7\r\n
From: nom.prenom@up-comp.com\r\n
Host: www.up-comp.com:80\r\n
Referer: http://www.up-comp.com/index.html\r\n
Transfer-Encoding: base64\r\n
User-Agent: Up ! Application System/4.0.0 \r\n
\r\n
Voici la réponse :
http://www.up-comp.com/french/index.html GET 1.1\r\n
Cache-control: no-cache\r\n
Date: Sun, 1 Jan 2006 18:52:33 GMT\r\n
Content-Encoding: gzip\r\n
Content-Language: fr\r\n
Content-Length: 1024\r\n
Content-Type: text/html\r\n
Expires: Sun, 1 Jan 2006 18:52:32 GMT\r\n
Last-Modified: Sun, 1 Jan 2006 18:52:32 GMT\r\n
Transfer-Encoding: base64\r\n
Server: Up ! Application System/4.0.0 \r\n
\r\n