Cours HTTP
Cours HTTP
Berners-Lee, MIT/LCS
Request for Comments: 1945 R. Fielding,
UC Irvine
Category: Informational H. Frystyk,
MIT/LCS
May 1996
INTERNE
T
STANDARDS & OFFICIAL
DOCUMENTS
Standard
Informational
Proposal
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
Note du Traducteur :
Le texte suivant est la traduction intégrale de la spécification HTTP 1.0, telle qu'éditée par les
auteurs originaux du protocole, sans ajouts, commentaires, ni omissions. Ce document a valeur
informative, selon la procédure courante d'enregistrement des documents au sein du W3C. Il
n'a de ce fait pas valeur de "norme", et, s'il peut être considéré comme document de référence,
il ne peut par contre octroyer une légitimité quelconque à un quelconque développement, ni
servir de preuve ni de garant d'une conformité quelle qu'elle soit.
Statut de ce mémo
Ce mémo est une information à destination de la communauté Internet. Il ne peut être
considéré comme une spécification officielle d'aucun protocole Internet. Sa distribution n'est
pas limitée.
Note IESG:
L'IESG espère que ce document sera rapidement remplacé par une norme officielle.
Contexte
L'Hypertext Transfer Protocol (HTTP) est un protocole de niveau application suffisamment
léger et rapide, pour la transmission de documents distribués et multimédia à travers un
système d'information multi-utilisateurs. Il s'agit d'un protocole générique, orienté objet, pouvant
être utilisé pour de nombreuses tâches, dans les serveurs de nom et la gestion d'objets
distribués par l'extension de ses méthodes de requête (commandes). Une caractéristique
d'HTTP est son typage des représentations de données, permettant la mise en oeuvre de
systèmes indépendants des données y étant transférées.
HTTP a été utilisé à l'initiative du World-Wide Web depuis 1990. Cette spécification décrit le
protocole de base référencé sous l'appellation "HTTP/1.0".
1. Introduction.................................................................................................................................. 6
1.1 Objectif .................................................................................................................................. 6
1.2 Terminologie.......................................................................................................................... 6
1.3 Fonctionnement global .......................................................................................................... 8
1.4 HTTP et MIME...................................................................................................................... 9
2. Conventions de notation et Grammaire générique .................................................................... 10
2.1 BNF étendue ........................................................................................................................ 10
2.2 Règles de base...................................................................................................................... 11
3. Paramètres du protocole............................................................................................................. 13
3.1 Numéro de Version .............................................................................................................. 13
3.2 Uniform Resource Identifiers .............................................................................................. 14
3.2.1 General Syntax.............................................................................................................. 14
3.2.2 URL http ....................................................................................................................... 15
3.3 Formats de temps et de date................................................................................................. 15
3.4 Tables de caractères ............................................................................................................. 16
3.5 Indication d'encodage du contenu ........................................................................................ 17
3.6 Types de média .................................................................................................................... 18
3.6.1 Canonisation et texte par défaut ................................................................................... 18
3.6.2 Types multiples "multipart" .......................................................................................... 19
3.7 Produits ................................................................................................................................ 19
4. Messages HTTP ......................................................................................................................... 20
4.1 Types de messages ............................................................................................................... 20
4.2 En-têtes de messages ........................................................................................................... 21
4.3 En tête générale.................................................................................................................... 21
5. Request ...................................................................................................................................... 22
5.1 Request-Line ........................................................................................................................ 22
5.1.1 Méthodes....................................................................................................................... 22
5.1.2 Request-URI ................................................................................................................. 23
5. En-tête de requête .................................................................................................................. 23
6. Réponse...................................................................................................................................... 25
6.1 Ligne d'état........................................................................................................................... 25
6.1.1 Code d'état et raison explicite ....................................................................................... 26
6.2 En-tête de réponse................................................................................................................ 27
7. Entités ........................................................................................................................................ 28
7.1 En-tête d'entité ..................................................................................................................... 28
7.2 Corps d'entité ....................................................................................................................... 28
7.2.1 Type .............................................................................................................................. 29
7.2.2 Longueur ....................................................................................................................... 29
8. Définition des méthodes ............................................................................................................ 30
8.1 GET...................................................................................................................................... 30
8.2 HEAD .................................................................................................................................. 30
8.3 POST.................................................................................................................................... 30
9. Définition des codes d'état ......................................................................................................... 32
9.1 Information 1xx ................................................................................................................... 32
9.2 Succès 2xx ........................................................................................................................... 32
200 OK................................................................................................................................... 32
201 Créé ................................................................................................................................. 32
EISTI / Fremaux 2 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
202 Acceptée.......................................................................................................................... 33
204 Pas de contenu ................................................................................................................ 33
9.3 Redirection 3xx.................................................................................................................... 33
1. Introduction
1.1 Objectif
L'Hypertext Transfer Protocol (HTTP) est un protocole de niveau application suffisamment
léger et rapide, pour la transmission de documents distribués et multimédia à travers un
système d'information multi-utilisateurs. HTTP à été utilisé à l'initiative du Word-Wide Web dès
1990. Cette spécification décrit les fonctionnalités le plus souvent rencontrées dans les
implémentation "client/serveur HTTP/1.0". Elle est divisée en deux section. Les fonctions
usuellement exploitées de HTTP sont décrites dans le corps de ce document. Les autres
fonctions, moins utilisées sont listées dans l'annexe D.
Les systèmes d'information pratiques nécessitent des fonctions plus évoluées que la simple
récupération de données, parmi lesquelles on trouve la possibilité d'effectuer des recherches,
les fonctions de remise à jour, et d'annotation. HTTP permet d'utiliser un ensemble non
exhaustif de méthodes pour définir l'objet d'une requête. Il s'appuie essentiellement sur la
normalisation des Uniform Resource Identifier (URI) [2], soit sous forme de "site" (URL) [4] ou
de noms (URN) [16], pour indiquer l'objet sur lequel porte la méthode. Les messages sont
transmis sous une forme similaire à celle de la messagerie électronique (Mail) [7] et des
extensions Multipurpose Internet Mail Extensions (MIME) [5]. HTTP est aussi un protocole de
communication générique entre des "utilisateurs" et des routeurs/proxies vers d'autres
protocoles, tels que SMTP [12],
NNTP [11], FTP [14], Gopher [1], et WAIS [8], permettant une accès de base à des
ressources hypermédia, et simplifiant l'implémentation d'interfaces utilisateur.
1.2 Terminologie
Cette spécification utilise un certain nombre de termes pour désigner les participants et les
objets d'une communication HTTP.
Connexion
Un circuit virtuel s'appuyant sur une couche de transport pour la communication
d'information entre deux applications.
Message
L'unité de base d'une communication HTTP, consistant en une séquence structurée d'octets
définie à la Section 4 et transmis via la connexion.
Requête
Un message de requête HTTP (défini en Section 5).
Réponse
EISTI / Fremaux 7 W3C / Berners Lee
RFC
Un1945 - HTTPde1.0réponse
message / FR / VE:DOC
HTTP (défini en Section 6). OR:05/96 - FR:10/97
Requête ------------------------>
UA -------------------v------------------- O
<----------------------- Réponse
Une situation plus complexe peut apparaître lorsque un ou plusieurs intermédiaires sont
présents dans la chaîne de communication. On trouvera trois types d'intermédiaires: les proxy,
les routeurs, et les tunnels. Un proxy est un agent actif, recevant les requêtes destinées à une
URI dans sa forme absolue, recomposant tout ou partie du message, et réémettant la requête
transformée à destination de l'URI. Un serveur est un agent actif, agissant en tant que
"surcouche" par rapport à d'autres serveurs et si nécessaire, traduisant le protocole à
destination et en provenance du serveur visé. Un tunnel est un agent passif ne servant que de
relais entre deux parties d'une même connexion, et de ce fait sans modifier le message; les
tunnels sont utilisés lorsque le message doit traverser un intermédiaire (comme un "firewall")
même si celui-ci ne peut interpréter le contenu des messages.
Requête -------------------------------------->
UA -----v----- A -----v----- B -----v----- C -----v----- O
<------------------------------------- Réponse
Toute partie de communication n'étant pas un tunnel doit posséder un cache pour le
stockage des requêtes. L'intérêt de cette pratique est que la chaîne requête/réponse peut être
considérablement raccourcie si l'un des intermédiaires dispose déjà d'une instance de la
ressource dans son cache. Le diagramme suivant montre le cas où B dispose dans son cache
d'une copie d'une réponse précédemment envoyée par O (via C) et répond à une requête
identique de UA (à noter que dans cet exemple, ni UA ni A ne disposent de cette même
réponse en cache).
Requête ---------->
EISTI / Fremaux 10 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC
UA -----v----- A -----v----- B - - - - - - C - - OR:05/96
- - - - -OFR:10/97
<--------- Réponse
Toutes les réponses ne peuvent être "cachées", et certaines requêtes peuvent utiliser des
modificateurs induisant un comportement particulier du cache. Certaines applications HTTP/1.0
utilisent des heuristiques pour décrire ce qui est ou non "cachable", mais ces règles ne sont
pas standardisées.
Sur Internet, les communications HTTP s'appuient principalement sur le protocole de
connexion TCP/IP. Le port utilisé par défaut est le port TCP 80 [15], d'autres ports pouvant être
utilisés. Ceci n'exclut pas que HTTP puisse être implémenté au dessus d'un autre protocole
d'Internet, ou sur d'autres types de réseau. HTTP nécessite seulement un transport fiabilisé;
tout protocole garantissant la sécurité de transmission peut être utilisé pour supporter HTTP, la
place qu'occupent les données des requêtes et réponses HTTP/1.0 dans les unités de
transmission de ces protocoles restant en dehors du contexte de ce document.
Excepté pour des applications expérimentales, la pratique courante spécifie qu'une
connexion doit être initiée par un client avant transmission de la requête, et refermée par le
serveur après délivrance de la réponse. Les deux côtés, client et serveur, doivent être préparés
à ce que la connexion soit coupée prématurément, suite à une action de l'utilisateur, une
temporisation automatique, ou une faute logicielle, et doivent apporter une réponse prévisible à
cette situation. Dans tous les cas, la fermeture d'une connexion qu'elle qu'en soit la raison est
assimilable à la conclusion de la requête, quel que soit l'état.
HTTP/1.0 définit la séquence CR LF comme marqueur de fin de ligne pour tous les éléments
excepté le corps de l'entité (voir Appendice B pour les tolérances). La fin de ligne à l'intérieur
d'un corps d'entité dépend de son média, comme décrit en Section 3.6.
CRLF = CR LF
Les en-têtes HTTP/1.0 peuvent être réparties su plusieurs lignes si chaque nouvelle ligne
commence par un espace ou une tabulation horizontale. Une suite d'espace, même sur
plusieurs lignes équivaut à un espace simple.
EISTI / Fremaux 15 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
LWS = [CRLF] 1*( SP | HT )
Cependant les en-têtes multilignes ne sont pas acceptées par toutes les applications, et
doivent de préférence être évitées lors d'un codage HTTP/1.0.
La règle TEXT est utilisée pour décrire des informations descriptives qui ne sont pas
sensées être interprétées. Les mots d'un élément *TEXT peuvent contenir d'autres caractères
que ceux de la table ASCII-US stricto sensu.
TEXT = <tout OCTET sauf CTL, hormis LWS qui reste autorisé>
Les récepteurs d'un élément TEXT d'une en-tête contenant des octets hors de la table
ASCII-US supposeront qu'il s'agit de caractères ISO-8859-1.
Les caractères hexadécimaux peuvent être utilisés dans certaines applications.
HEX = "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" |
"d"
| "e" | "f" | DIGIT
De nombreux champs d'en-tête HTTP/1.0 sont formés de mots séparés par des espaces ou
caractères spéciaux. Ces caractères doivent être entre guillemets lorsqu'ils sont utilisés à
l'intérieur d'une valeur.
Les commentaires pourront être insérés dans les en-têtes HTTP en les entourant de
parenthèses. Les commentaires ne sont permis que dans les champs contenant le mot
"comment" dans leur définition. Dans tous les autres champs, les parenthèses sont interprétées
comme faisant partie de l'expression.
Une chaîne sera interprétée comme un seul mot si elle est entre double guillemets.
L'utilisation du backslash ("\") comme séquence d'échappement d'un caractère unique n'est
pas permis par le protocole HTTP/1.0
3. Paramètres du protocole
Notez que les nombres "supérieure" et "inférieure" doivent être pris comme deux entiers
distincts et que chacun peut être amené à prendre une valeur supérieure à un simple digit.
Ainsi, HTTP/2.4 est une version plus basse que HTTP/2.13, à son tour plus basse que
HTTP/12.3. Des zéros mentionnés en tête de nombre doivent être ignorés par le récepteur, et
ne devraient pas être émis par l'émetteur.
Ce document définit les versions 0.9 et 1.0 du protocole HTTP. Les applications envoyant
des "requêtes pleines" ou "réponses pleines", et définies dans cette spécification, doivent
signaler une version HTTP-Version "HTTP/1.0".
Les serveurs HTTP/1.0 doivent:
port = *DIGIT
Si le port est vide ou non spécifié, le port 80 est pris par défaut. La sémantique précise que
cette ressource est localisée sur le serveur acceptant les connexions TCP sur ce port et sur cet
ordinateur, l'URI de requête de la ressource en est le chemin d'accès absolu chem_abs. Si
chem_abs n'est pas précisé dans l'URL, il doit être remplacé par un "/" lorsque l'URI de requête
est utilisée (Section 5.1.2).
Note : Bien que le protocole HTTP soit indépendant de la couche transport, l'URL http
identifie la ressource par son adresse TCP, Les ressources non TCP devant être
atteintes via un autre schème d'URI.
La forme canonique d'une URL "http" est obtenue en convertissant tous les caractères
UPALPHA dans la chaîne "host" par leur équivalent LOALPHA (les noms de host ne tiennent
pas compte de la casse), en éludant le descriptif [ ":" port ] si le port vaut 80, et en remplaçant
le chem_abs vide par un "/".
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, mis à jour par la RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsolète depuis la RFC 1036
Sun Nov 6 08:49:37 1994 ; Format asctime() du C ANSI
Le premier format est préféré pour Internet pour une raison liée à la longueur fixe de ses
sous-champs, définis par la RFC 1123 [6] (une mise à jour de la RFC 822 [7]). Le second
format est d'usage commun, mais se base sur le format de date tel que défini par la RFC 850
[10] désormais obsolète, et présente l'inconvénient d'un champ d'année sur deux digits. Les
clients et serveurs HTTP/1.0 doivent reconnaître les trois formats, même s'ils ne doivent jamais
générer le troisième (convention du C).
Note : Les récepteurs de valeurs de date doivent avoir une implémentation robuste et
de ce fait être capables de reconnaître des formats de date émanent
d'applications non-HTTP, comme il peut leur en parvenir en postant ou
récupérant des messages via proxy/routeur de et vers SMTP ou NNTP.
EISTI / Fremaux 21 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
Note : Les contraintes au niveau du format de date HTTP ne sont valables qu'à
l'intérieur du réseau de transmission. Les clients et serveurs ne sont pas obligés
de respecter cette présentation pour l'affichage, la présentation de requête,
l'accès, etc.
Les "tables de caractères" HTTP sont définies par des mots sans distinction de casse.
EISTI / Fremaux 23 W3C / Berners Lee
RFC 1945 - HTTP
L'ensemble 1.0 /de
complet FR ces
/ VE:DOC
tables constitue le "registre de tables de OR:05/96 - FR:10/97 Set
l'IANA" (Character
Bien qu'HTTP permette l'utilisation de tout nom arbitraire pour désigner une table de
caractères, tout nom désignant déjà une des tables du registre IANA doit indiquer cette table
précise. Il est conseillé que les applications s'en tiennent aux tables de caractères définies
dans ce registre.
La table de caractère indiquée pour un corps d'entité doit être le plus petit dénominateur
commun de l'ensemble des codes de caractères utilisés dans ce corps, sauf si l'on préfère
systématiquement s'en tenir aux tables de base ASCII-US ou ISO-8859-1.
Note : Pour des raisons de compatibilité future, les applications HTTP/1.0 doivent
interpréter
"gzip" et "compress" respectivement comme "x-gzip" et "x-
compress".
Toute mention d'encodage est indépendante de la casse. L'HTTP/1.0 utilise les descripteurs
d'encodage dans le champ Content-Encoding (Section 10.3) de l'en-tête. Le plus important est
que cette information indique quel est le type de décodage que le récepteur devra utiliser pour
exploiter la ressource. Notez qu'un même programme peut être capable de décoder plusieurs
types d'encodage. Les deux valeurs définies dans cette spécification sont:
x-gzip
Un format de compression géré par le programme de compression "gzip" (GNU zip)
développé par Jean-Loup Gailly. Ce codage est de type Lempel-Ziv (LZ77) avec CRC sur
32 bits.
x-compress
Un format de compression géré par le programme "compress" effectuant une
compression adaptative de type Lempel-Ziv-Welch (LZW).
Le type, sous-type et les noms d'attributs sont insensibles à la casse. Les valeurs associées
aux attributs peuvent l'être ou ne pas l'être, suivant la sémantique du nom de l'attribut. les types
et sous type ne peuvent être séparé par un LWS. Ceci est valable pour les paires attribut/valeur
Lorsqu'un récepteur reçoit un paramètre irrecevable pour le type de média spécifié, il devra
traiter le descripteur comme si cette paire attribut/valeur n'existait pas..
Certaines anciennes applications HTTP ne reconnaissent pas le type de média. Les
applications HTTP/1.0 ne pourront définir le type que lorsque la spécification du contenu est
indispensable.
Les valeurs admises de types de média sont définies par la Internet Assigned Number
Authority (IANA [15]). Le processus d'enregistrement d'un type de média est spécifié dans la
RFC 1590 [13]. L'usage de types non enregistrés est déconseillé.
3.7 Produits
La spécification de produit permet à deux application en communication de s'identifier l'une à
l'autre par un simple nom, suivi d'un "slash" ('/') et d'un numéro de version, tous deux
optionnels. Les champs acceptant cette spécification permettent de lister des sous-éléments
significatifs d'un produit, séparés par un espace. Par convention, les produits sont rangés par
ordre d'importance dans le processus d'identification.
Exemples:
Server: Apache/0.8.4
4. Messages HTTP
Les requêtes et réponses "complètes" utilisent le format de message défini dans la RFC 822
[7] concernant la transmission d'entités. Ces deux messages peuvent contenir une en-tête
optionnelle ainsi que le corps de l'entité. Le corps et l'en-tête de l'entité sont séparés par une
ligne vide (soit une séquence CRLFCRLF).
Les requête et réponse simple ne transportent jamais d'en-tête. Une seule requête est de ce
type : GET.
Réponse_simple = [ Corps_entité ]
L'usage des requêtes simples reste déconseillé, car il ne permet pas au serveur de définir le
type de média dans sa réponse.
nom = nom_de_champ
valeur = *( contenu | LWS )
L'ordre dans lequel les champs d'en-tête sont reçus n'a pas d'importance. Une "bonne
habitude" consistera toutefois à envoyer les champs d'en-tête_générale en premier, suivi des
champs d'en-tête_requête ou d'en-tête_réponse, puis enfin les champs d'en-tête_entité.
Lorsque plusieurs champs de même nom doivent être définis avec des valeurs différentes,
celles-ci doivent apparaître comme une liste séparée par des virgules [#(values)]. Il doit être
possible de combiner cette définition multiple à partir des paires individuelles "nom: valeur",
sans changer la sémantique du message, en ajoutant chaque valeur à la suite de la première,
en utilisant une virgule comme séparateur.
Des nouveaux noms de champs d'en-tête_générale ne peuvent être introduits que dans le
cadre d'un changement de version du protocole. Cependant, de nouveaux champs ou champs
expérimentaux peuvent utiliser la sémantique de champs d'en-tête_générale, à partir du
moment ou les deux extrémités de la communication sont d'accord pour le faire. Tout champ
non reconnu sera considéré comme un champ d'en-tête_entité.
5. Requêtes
Une requête d'un client vers un serveur inclue, dans sa première ligne, la méthode appliquée
à la ressource, l'identificateur de cette ressource, et la version de protocole courante. Afin
d'assurer la compatibilité descendante avec la version plus limitée HTTP/0.9 du protocole, deux
formats seront valides pour exprimer une requête:
Si un serveur HTTP/1.0 reçoit une requête simple, il devra répondre par une réponse simple
HTTP/0.9. Un client HTTP/1.0 capable de recevoir une réponse_complète ne doit jamais
générer de requête_simple.
5.1.1 Méthodes
La méthode indiquée en tête de ligne est destinée à être appliquée à l'URI cible. Son nom
dépend de la casse.
La liste de méthodes que peut accepter une ressource est dynamique; Le client est avisé de
la disponibilité de la méthode émise par le code de retour du message de réponse. Les
serveurs renverront le code 501 (non implémenté) si la méthode est inconnue, ou non
implémentée.
Les méthodes habituellement employées par les applications HTTP/1.0 sont décrites en
détail en Section 8.
La forme d'URI-visée la plus commune est celle qui identifie une ressource sur son serveur
origine ou un routeur. Dans ce cas, seul le chemin absolu chem_abs est transmis (Cf. Section
3.2.1, chem_abs). Par exemple, un client souhaitant récupérer la ressource ci-dessus
directement à partir de son serveur origine créera une connexion TCP sur le port 80 du host
"www.w3.org" et émettra la ligne de commande:
suivi du reste de la requête complète. Notez qe le chemin absolu ne peut être vide; si la
ressource se trouve dans la racine (pas de chemin d'accès) le chemin spécifié devra comporter
au moins le caractère slash ("/").
L'URI-visée est transmise sous forme d'une chaîne encodée, dans laquelle certains
caractères apparaîtront comme une séquence d'échappement "% HEX HEX" telle que définie
par la RFC 1738 [4]. Le serveur origine devra décoder cette chaîne afin d'accéder correctement
à la ressource.
Des nouveaux noms de champs d'en-tête_requête ne peuvent être introduits que dans le
cadre d'un changement de version du protocole. Cependant, de nouveaux champs ou champs
expérimentaux peuvent utiliser la sémantique de champs d'en-tête_requête, à partir du moment
ou les deux extrémités de la communication sont d'accord pour le faire. Tout champ non
reconnu sera considéré comme un champ d'en-tête_entité.
6. Réponse
Une fois la requête reçue et interprétée, un serveur répond par un message HTTP de
réponse.
Réponse_simple = [ Corps_entité ]
Une réponse_simple ne peut être envoyé qu'en réponse d'une requête_simple HTTP/0.9 ou
si le serveur ne supporte que la version limitée de protocole HTTP/0.9. Si un client émet une
requête_complète HTTP/1.0 et reçoit une réponse ne commençant pas par une ligne_état, il
devra conclure qu'il s'agit d'une réponse_simple et l'interprétera en conséquence. Notez qu'une
réponse ne contient que le corps_entité, et se termine par la fermeture de la connexion par le
serveur.
(ex., "HTTP/1.0 200 "), la seule présence de cette expression est suffisante pour différentier
une réponse_simple d'une réponse_complète émise en retour d'une requête sousle protocole
HTTP/1.0. Le format de réponse_simple n'interdit cependant pas qu'une telle expression soit
placée en tête du corps d'entité, provoquant ainsi une erreur d'interprétation de la part du
récepteur. Dans la pratique, la plupart des serveurs HTTP/0.9 ne peuvent générer que des
réponses de type "text/html", ce qui en principe, élimine le risque d'une telle confusion.
EISTI / Fremaux 35 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
6.1.1 Code d'état et raison explicite
L'élément code_état est un nombre entier à 3 chiffres indiquant le succès ou la cause
d'erreur de la transaction. L'élément "raison" est un commentaire textuel destiné à identifier
explicitement la cause d'erreur. Le code d'état sera en général exploité par des automates. La
raison est à destination de notre intellect humain.
Celle-ci n'est pas obligatoirement traitée ni reportée par le client.
Le premier chiffre du code d'état indique la classe générale de la réponse. Les deux derniers
n'ont pas de rôle de classification particulier. Le premier chiffre peut prendre 5 valeurs:
Les valeurs actuellement reconnues sous HTTP/1.0, et les phrases types d'explicitation
associées, sont présentées ci-dessous. Ces phrases ne sont que recommandées -- elles
peuvent être remplacées par des variations locales sans affecter le protocole. Ces codes sont
intégralement listés en section 9.
Code_état = "200" ; OK OK
| "201" ; Created Créé
| "202" ; Accepted Accepté
| "204" ; No Content Pas de contenu
| "301" ; Moved Permanently Changement définitif
| "302" ; Moved Temporarily Changement temporaire
| "304" ; Not Modified Non modifié
| "400" ; Bad Request Requête incorrecte
| "401" ; Unauthorized Non autorisé
| "403" ; Forbidden Interdit
| "404" ; Not Found Non trouvé
| "500" ; Internal Server Error Erreur interne serveur
| "501" ; Not Implemented Non implémenté
| "502" ; Bad Gateway Erreur de routeur
| "503" ; Service Unavailable Indisponible
| autres_codes
autres_codes = 3DIGIT
La liste des codes HTTP est extensible, mais seuls les codes ci-dessus sont utilisés dans la
pratique courante. Les applications HTTP n'ont pas nécessairement à connaître la signification
de tous les codes enregistrés, bien que ce soit souhaitable pour des raisons évidentes. Au
minimum, les applications devront pouvoir comprendre le premier chiffre de ce code, et
comprendre tout numéro de réponse non identifié comme le numéro x00 de la classe, indiquant
ainsi la définition générique de la classe. Aucune réponse non identifiée ne peut être
enregistrée en cache.
Par exemple, si un code "inconnu" 431 est reçu par le client, celui-ci peut interpréter sans doute
possible qu'un problème est survenu, et peut réagir comme s'il avait reçu le code 400. Dans
de tels cas, il est fortement conseillé que l'application reporte le corps de l'entité de réponse,
dans la mesure où il y a de fortes chances que celui-ci contienne des informations "en clair" sur
la nature de l'erreur.
EISTI / Fremaux 36 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
6.2 En-tête de réponse
Les champs d'en-tête de réponse véhiculent certaines informations complémentaires
concernant cette réponse, et qui ne peuvent être mentionnées dans la ligne d'état. Ces champs
donnent des informations sur le serveur lui-même, et sur les actions à mener par la suite pour
accéder à la ressource demandée.
Des nouveaux noms de champs d'en-tête_réponse ne peuvent être introduits que dans le
cadre d'un changement de version du protocole. Cependant, de nouveaux champs ou champs
expérimentaux peuvent utiliser la sémantique de champs d'en-tête_réponse, à partir du
moment ou les deux extrémités de la communication sont d'accord pour le faire. Tout champ
non reconnu sera considéré comme un champ d'en-tête_entité.
7. Entités
Les messages de requête et de réponses contiennent généralement une entité dans laquelle
est incluse des éléments de requête ou de réponse. Une entité est définie par une en-tête
d'entité, et dans la plupart des cas par un corps d'entité. Dans ce qui suit "l'émetteur" et le
"récepteur" se réfèrent tantôt au client, tantôt au serveur, suivant l'agent qui émet le message.
champ_en-tête = en-tête_HTTP
Corps_entité = *OCTET
Un corps d'entité n'apparaît dans un message de requête que dans la mesure ou le type de
requête le demande. La présence de ce corps est signalée par la présence d'un champ
Content-Length dans les champs d'en-tête de la requête. Les requêtes HTTP/1.0 contenant un
corps doivent nécessairement présenter un champ d'en-tête Content-Length valide.
Dans les réponses, la présence d'un corps d'entité est fonction à la fois de la nature de la
requête préalable, et du code d'état renvoyé. Toute réponse à une requête de type HEAD ne
peut contenir de corps d'entité, même si les champs d'en-tête présents prétendent le contraire.
Les codes d'état 1xx (informations), 204 (pas de contenu), et 304 (non modifié) supposent
implicitement ou explicitement l'absence de tout corps d'entité. Toutes les autres réponses
EISTI / Fremaux 38 W3C / Berners Lee
RFC 1945contenir
peuvent - HTTP un
1.0 corps
/ FR / VE:DOC OR:05/96
d'entité, ou à défaut, un champ Content-Length spécifié- àFR:10/97
zéro (0).
7.2.2 Longueur
Lorsqu'un corps d'entité est présent dans un message, la longueur de ce corps doit être
explicitée par l'un des deux moyens suivants. Si un champ Content-Length est présent, sa
valeur associée représente la longueur en octets du corps d'entité.
Autrement, c'est la déconnexion par le serveur qui marque la fin du corps d'entité.
Cette dernière méthode ne peut être utilisée pour marquer la fin d'une requête, car la
possibilité doit être laissée au serveur d'envoyer une réponse. C'est pourquoi le protocole
HTTP/1.0 précise que toute requête contenant un corps d'entité doit mentionner sa longueur
dans un champ d'en-tête Content-Length valide. Si tet est le cas, et que ce champ n'existe pas
dans le message, et dans la mesure où le serveur ne peut calculer ou déterminer la longueur
de ce corps, ce dernier répondra par un message de code 400 (erreur client).
L'ensemble des méthodes courantes d'HTTP/1.0 est défini ci-dessous. Bien que cet
ensemble puisse être complété, il est précisé ici que des méthodes additionnelles
implémentées par des clients ou serveurs distincts ne peuvent partager la même sémantique
que si leur fonction est identique.
8.1 GET
La méthode GET signifie "récupérer" le contenu quel qu'il soit de la ressource (sous forme
d'une entité) identifiée par l'URI-visée. Si l'URI-visée identifie un processus générant
dynamiquement des données, ce sont les données produites qui sont renvoyées dans l'entité
au lieu du source de l'exécutable appelé, sauf si ce texte lui-même est la sortie du processus.
La sémantique de la méthode GET introduit une notion conditionnelle si la requête inclue le
champ d'en-tête If-Modified-Since. Une méthode GET conditionnelle ne récupère la ressource
que si celle-ci a été modifiée depuis la date associée au champ If-Modified-Since, comme
indiqué en Section 10.9. La méthode GET conditionnelle est utilisée pour réduire la charge du
réseau en permettant à des ressources en cache d'être rafraîchies sans multiplier les requêtes
ou transférer des données inutiles.
8.2 HEAD
La méthode HEAD est identique à la méthode GET, sauf qu'elle ne demande pas la
transmission du corps d'entité de la ressource en retour. Seule les métainformations constituant
l'en-tête HTTP de la ressource sont envoyées. Cette méthode permet de ne demander que les
informations concernant la ressource (au sens d'HTTP). Elle est utilisée à des fins de tests
d'hyperliens, vérification d'existence ou d'actualité d'une ressource.
Il n'existe pas de méthode HEAD conditionnelle comme pour la méthode GET. Si un champ
d'en-tête If-Modified-Since est présent dans une requête HEAD, il devra être ignoré.
8.3 POST
La méthode POST est utilisée pour indiquer au serveur de soumettre l'entité contenue dans
le message à la ressource identifiée par l'URI-visée. POST est destinée à fournir un moyen
uniforme pour les opérations suivantes:
La fonction effective de la méthode POST est définie par le serveur et dépend de l'URI
désignée. L'entité "postée" est subordonnée à cette URI dans le même sens qu'un fichier est
subordonné au répertoire qui le contient, un article est subordonné au groupe de nouvelles à
qui il a été posté, ou un enregistrement à une base de données.
La résolution d'une méthode POST ne signifie pas forcément la création d'une entité sur le
serveur origine, ni une possibilité d'accès futur à ces informations. En d'autres termes, le
résultat d'un POST n'est pas nécessairement une ressource associable à une URI. Dans ce
cas, une réponse de code 200 (OK) ou 204 (pas de contenu) est la réponse la plus appropriée,
suivant que la réponse contient ou non une entité pour décrire le résultat.
Si une ressource a été créée sur le serveur origine, la réponse sera du type
201 (créé) et contiendra l'entité (de préférence du type "text/html") qui décrira les informations
sur la requête et contiendra une référence sur la nouvelle ressource.
Un champ Content-Length valide est demandé dans toute requête POST HTTP/1.0. Un
serveur HTTP/1.0 répondra par un message 400 (requête incorrecte) s'il ne peut déterminer la
longueur du contenu du message.
Les applications ne peuvent enregistrer en cache les réponses à des requêtes POST dans la
mesure où il n'est absolument pas certain qu'une réponse ultérieure émise dans les mêmes
conditions produise le même résultat.
Tous les codes d'état actuellement valides sont décrits ci-dessous, en précisant quelle
méthode peut en être l'origine, ainsi que les métainformations à fournir dans la réponse.
200 OK
La requête a abouti. L'information retournée en réponse dépend de la requête émise,
comme suit:
GET
Une entité correspondant à l'URI visée par la requête est renvoyée au client;
HEAD
La réponse au client ne doit contenir que les champs d'en-tête à l'xclusion de tout corps
d'entité;
POST
Une entité décrivant le résultat de l'action entreprise.
201 Créé
La requête a abouti, et une nouvelle ressource réseau en résulte.
La nouvelle ressource créée est accessible par l'URI(s) renvoyée dans l'entité de la réponse.
La ressource doit être créée avant que ce code ne soit envoyé. Si la création ne peut pas être
opérée immédiatement, le serveur devra indiquer dans la réponse quand la ressource
deviendra disponible ou retourner un message de type 202 (acceptée).
EISTI / Fremaux 44 W3C / Berners Lee
RFC 1945 - HTTP seule
Actuellement, 1.0 / FR
la /méthode
VE:DOCPOST peut conduire à la création d'une
OR:05/96 - FR:10/97
ressource.
Note : Certains clients, lorsqu'ils redirigent une requête POST, transforment par
erreur cette requête en une requête GET après réception d'un code 302.
Note : Si le client émet des données, les implémentations de TCP devront s'assurer
que le client a bien émis tous les accusés de réception des paquets transportant
la réponse avant de couper la connexion d'entrée. Si le client continue
d'envoyer des données alors que le serveur a fermé la liaison, le TCP serveur
émettra en retour un paquet RST (reset), qui risque de stimuler un effacement
prématuré de toutes les données reçues dans les tampons interne du TCP client
(y compris les données concernant la réponse) avant que celles-ci n'aient pu être
transmises à l'application HTTP.
403 Interdit
Le serveur a compris la requête, mais refuse de la satisfaire.
Une démarche d'authentification n'y fera rien et cette requête ne doit pas être renouvelée. Si
la méthode invoquée est différente de HEAD et le serveur souhaite rendre public la raison pour
laquelle il refuse le traitement, il le fera dans l'entité liée à cette réponse. Ce code d'état est
souvent utilisé lorsque le serveur ne souhaite pas s'étendre sur les raisons pour lesquelles il
refuse un accès, ou parce que c'est la seule réponse qui convienne.
Note : L'existence de ce code d'état 503 n'implique pas que le serveur l'utilise
dès qu'il est surchargé. Certains serveurs dans cette situation refuseront tout
bonnement la connexion.
EISTI / Fremaux 50 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
Cette section décrit la syntaxe et la sémantique des champs d'en-tête essentiels utilisés
dans le cadre d'HTTP/1.0. Pour les champs généraux et d'entité, l'émetteur et le récepteur
peuvent tour à tour désigner le client ou le serveur, suivant celui qui est à l'origine de la
transaction.
10.1 Allow
Le champ Allow (entité) liste l'ensemble des méthodes supportées par la ressource désignée
par l'URI-visée. La fonction de ce champ est simplement d'informer le récepteur sur les
méthodes qu'il peut utiliser sur la ressource. Ce champ n'est pas autorisé dans un requête de
type POST, et doit être ignoré s'il apparaît dans ce dernier cas.
Exemple:
Ce champ ne pourra prévenir le client de tenter d'appliquer d'autres méthodes que celles
acceptées par la ressource. Il n'est là qu'à titre informatif. Les méthodes acceptées sont
définies par le serveur origine pour chaque requête reçue.
Un proxy ne doit pas modifier le champ d'en-tête Allow même s'il ne connaît pas toutes les
méthodes spécifiées, car l'utilisateur peut avoir à sa disposition d'autres moyens de
communiquer avec le serveur origine.
Le champ d'en-tête Allow n'indique pas si les méthodes indiquées sont implémentées par le
serveur (seulement si elles sont à priori acceptables par la ressource).
10.2 Authorization
Un utilisateur désireux de s'identifier auprès d'un serveur—en général, mais pas
nécessairement, après réception d'une réponse 401—peut le faire en incluant un champ
d'en-tête Authorization dans sa nouvelle requête. Ce champ contiendra les données
d'autentification de l'utilisateur pour la ressource considérée.
10.3 Content-Encoding
Le champ Content-Encoding (entité) est utilisé pour compléter l'information de type de
média. Lorsqu'il est présent, il indique sous quel codage la ressource est enregistrée, et par
voie de conséquence, quel traitement doit être opéré sur l'entité pour pouvoir exploiter celle ci
sous son type de média original, défini dans le champ d'en-tête Content-Type. Le champ
Content-Encoding a été à l'origine intauré pour permettre la mise à disposition de ressource
sous forme compressées, de sorte qu'il soit possible d'en connaître le type de média d'origine.
Content-Encoding: x-gzip
10.4 Content-Length
Le champ d'en-tête Content-Length (entité) indique la taille du corps d'entité, sous la forme
d'un nombre d'octets exprimé en décimal, envoyé au récepteur. Dans le cas d'une requête de
type HEAD, il renvoie la taille du corps d'entité que le serveur aurait renvoyé si la ressource
avait fait l'objet d'une requête GET.
Exemple:
Content-Length: 3495
10.5 Content-Type
Le champ d'en-tête Content-Type (entité) indique le type de média envoyé au récepteur
dans le corps d'entité, ou, si la méthode invoquée est HEAD, le type de média du corps d'entité
qui aurait été envoyé si la ressource avait fait l'objet d'une requête de type GET.
Content-Type: text/html
Une présentation d'autres méthodes pour identifier le type de média est donnée en Section
7.2.1.
10.6 Date
Le champ d'en-tête Date (général) donne la date et l'heure à laquelle le message a été
"rédigé", et utilise la sémantique de dates de la RFC 822. La valeur de ce champ est une date
dans un des formats HTTP décrits à la Section 3.3.
Exemple:
Si un message est reçu en direct du client (pour les requêtes) ou du serveur origine (pour les
réponses), on peut affirmer qu'il s'agit aussi de la date d'arrivée au récepteur. En outre, dans la
mesure où la date — délivrée par l'origine — est un paramètre important pour tout ce qui
touche à la gestion des caches, il est vivement conseillé que les serveurs origine renseignent
systématiquement ce champ à la constitution de tout message. Les clients peuvent se limiter à
l'envoi d'une date lorsque la requête contient un corps d'entité, comme dans le cas d'une
requête POST, et encore cette pratique n'est pas obligatoire. Un message reçu et non daté se
verra assigner une date par le récepteur si ce message doit être enregistré en cache ou rerouté
via un protocole qui exige une Date.
En théorie, la date doit représenter l'instant juste avant l'émission. En pratique, c'est à la
constitution du message que la date est inscrite.
10.7 Expires
Le champ d'en-tête Expires (entité) indique la date et l'heure à partir de laquelle le message
doit être considéré comme obsolète. Ceci permet de suggérer la notion de "validité temporaire"
de l'information. Les applications ne doivent pas enregistrer ces entités dans leur cache après
la date spécifiée. Le présence d'un champ Expires ne signifie pas que la ressource originale n'a
pas changé ou n'existe plus à cette date, avant, ou après cette date. Cependant, tout serveur
sachant, ou pouvant supposer que cette ressource aura changé à une certaine date devra de
préférence inclure un champ Expires avec cette date. Le format de la date mentionnée est une
date absolue telle que définie à la Section 3.3.
Exemple:
Si la date indiquée dans ce champ est égale ou antérieure à la date mentionnée dans le
champ date du même en-tête, le serveur ou routeur, ou application ne devra pas enregistrer
cette ressource dans son cache. Si la ressource est dynamique par nature, comme c'est le cas
pour des résultats de processus générateurs de données, les entités produites se verront
attribuées un champ Expires renseigné d'une façon correspondante à ce "dynamisme".
EISTI / Fremaux 54 W3C / Berners Lee
RFCLe1945 - HTTP
champ 1.0 / ne
Expires FR peut
/ VE:DOC OR:05/96
pas être utilisé pour forcer un client à rafraîchir - FR:10/97 une
ou recharger
ressource. Sa sémantique ne concerne que les mécanismes de gestion du cache, lesquels
Note : Il est encouragé que les applications fassent preuve d'une certaine tolérance
quant à des implémentations erronées ou incomplètes du champ Expires. Une
valeur zéro (0) ou une date présentée sous un mauvais format signifient
"expiration immédiate". Bien que ces valeurs ne soient pas valides dans le cadre
d'HTTP/1.0, une implémentation tolérante est toujours souhaitable.
10.8 From
Le champ d'en-tête From (requête), si présent, devra contenir l'adresse e-mail Internet de
l'utilisateur "humain" contrôlant le client émetteur de la requête. Cette adresse doit être codée
sous une forme utilisable par les machines, telle que définie dans la RFC 822 [7] (et RFC 1123
[6]):
Exemple:
From: [email protected]
Ce champ est exploité à des fins de statistiques, et pour identifier la source de requêtes non
valides ou non autorisées. Il ne doit cependant pas être utilisé dans un contexte de sécurisation
d'accès. Il doit être interprété comme l'identification de la personne ayant formulé la requête, et
qui accepte la responsabilité de la méthode employée. En particulier, les robots devront
renseigner ce champ afin que son responsable d'exploitation puisse être contacté en cas de
dysfonctionnement à l'autre extrémité.
L'adresse e-mail Internet dans ce champ doit être séparé de la mention du nom de
l'ordinateur d'où a été émis la requête. Par exemple, lorsque la requête a transité par
l'intermédiaire d'un proxy, l'adresse de la source originale doit y être mentionnée.
Note : Le client ne peut donner de valeur pour ce champ Form sans l'autorisation de
l'utilisateur, car cette information rentre dans le cadre de la protection des
données privées et des droits individuels. Il est fortement recommandé que le
client laisse le choix à l'utilisateur de pouvoir activer, désactiver, et modifier
la valeur émise dans ce champ avant émission de toute requête.
10.9 If-Modified-Since
Le champ d'en-tête If-Modified-Since (requête) est utilisé lors d'une requête de type GET
pour en émettre une forme conditionnelle: Si la ressource visée n'a pas été modifiée depuis la
date mentionnée dans ce champ, la copie de la ressource ne sera pas renvoyée par le serveur;
En lieu et place, une réponse de type 304 (non modifié) sera renvoyée sans aucun corps
d'entité associé.
a) Si la résolution de la requête conduit à une réponse autre que 200 (OK), ou si la date passée
par le champ If-Modified-Since n'est pas valide, la réponse sera alors donnée comme si la
méthode invoquée était un GET standard. Une date postérieure à la date courante du
serveur est non valide.
b) Si la ressource a été modifiée après la date If-Modified-Since, la réponse sera donnée
comme dans le cas d'une méthode GET standard.
c) Si la ressource n'a pas été modifiée depuis la date If-Modified-Since, et cette date est valide,
le serveur renverra une réponse 304 (non modifié).
Le but de cette implémentation est de permettre une remise à jour efficace des informations
en cache, en réduisant au maximum les transactions réseau.
10.10 Last-Modified
Le champ d'en-tête Last-Modified (entité) indique la date et l'heure à laquelle le serveur
pense que la ressource visée a été modifiée pour la dernière fois. La sémantique exacte de ce
champ dépend fortement de la manière dont le récepteur va le comprendre: Si le récepteur
dispose d'une copie de cette ressource d'une date inférieure à celle mentionnée dans le champ
Last-Modified, cette copie devra être considérée comme obsolète.
Exemple:
10.11 Location
Le champ d'en-tête Location (réponse) renvoie la localisation exacte de la ressource
identifiée par l'URI-visée de la requête. Pour des réponses 3xx, ce champ indique l'URL "de
préférence" donnée par le serveur pour la fonction de redirection automatique. Une seule URI
absolue peut être mentionnée à la fois.
Location: http://www.w3.org/hypertext/WWW/NewLocation.html
10.12 Pragma
Le champ d'en-tête Pragma (générale) est utilisé pour transmettre des directives
dépendantes de l'implémentation à tous les agents de la chaîne de requête/réponse. Toutes
les directives Pragma spécifient un comportement particulier optionnel de la part des agents vis
à vis du protocole; cependant, certains systèmes ne pourront répondre à toutes les directives.
Lorque la directive "no-cache" est présente dans un message de requête, les applications
doivent répercuter la requête jusqu'au serveur origine, même si elles disposent d'une copie de
la ressource en cache. Ceci permet au client de forcer la récupération d'une "première copie"
d'une ressource. Ceci permet de plus de demander au client une remise à jour de copies
cachées, dans le cas où ces copies se sont avérées défectueuses, ou obsolètes.
Les directives Pragma doivent être réémises par les routeurs ou proxies, quelle que soit leur
signification à l'égard des applications, dans la mesure où ces directives concernent toutes les
applications de la chaîne de requête/réponse. Il n'est pas possible de définir un pragma ne
concernant qu'un intermédiaire donné dans la chaîne; Cependant, toute directive non reconnue
par l'un des récepteurs sera ignorée.
10.13 Referer
Le champ d'en-tête Referer (requête) permet au client d'indiquer, à l'usage du serveur,
l'adresse (URI) de la ressource dans laquelle l'URI-visée a été trouvée. Ceci permet au serveur
de générer et entretenir des listes de "rétro-liens" destinées à renseigner les clients futurs sur
des "sites intéressants", ou à but d'archivage et d'analyse, optimisation de cache, etc. Il permet
aussi l'analyse de liens obsolètes ou de type incorrect à but de maintenance. Le champ Referer
ne doit pas être inscrit si la source de l'URI-visée provient d'une entité n'ayant pas d'URI propre,
comme l'entrée de l'adresse via un clavier.
Exemple:
Referer: http://www.w3.org/hypertext/DataSources/Overview.html
Si une URI partielle est donnée, elle se référera relativement à l'URI-visée. L'URI donnée en
référence ne doit pas inclure de fragment.
Note : Dans la mesure où la référence d'un lien est une information qui peut avoir
un caractère privé, ou être amenée à révéler une information privée, il est
recommandé de laisser le choix à l'utilisateur final de renseigner ou non ce
champ. Par exemple, un navigateur pourra disposer d'un commutateur qui
permettra une navigation ouverte ou anonyme, qui simultanément peut activer
ou désactiver l'émission des champs Referer et Form.
Exemple:
Si la réponse est transmise via un proxy, ce dernier ne doit pas ajouter ses propres
commentaires à la liste.
10.15 User-Agent
Le champ d'en-tête User-Agent (requête) contient des informations sur l'utilisateur émetteur
de la requête. Cette information est utilisée à des fins statistiques, pour tracer des violations de
protocole, et à des fins de reconnaissance automatique d'utilisateur permettant de formater la
réponse de la manière la plus adaptée. L'usage de ce champ, bien que non indispensable, est
cependant conseillé. Le champ User-Agent peut mentionner plusieurs noms de produits
(Section 3.7) ainsi que des commentaires identifiant le programme ou des sous-composants de
ce programme dans la mesure où ceux-ci peuvent être significatifs pour le serveur. Par
convention, ces informations sont listées par ordre d'importance.
Exemple:
Note : Certains proxies ajoutent leur propre information à ce champ. Ceci est
déconseillé, dans la mesure où le contenu final de ce champ peut alors devenir
ambigu, voire confus.
10.16 WWW-Authenticate
Le champ d'en-tête WWW-Authenticate (réponse) doit être inclus dans des réponses de
type 401 (non autorisé). La valeur du champ consiste en un ou plusieurs "modèles"
d'identification pour l'URI-visée.
Le processus d'identification et d'authentification d'accès HTTP est décrit en Section 11. Les
applications utilisatrices doivent interpréter avec circonspection la valeur d'un champ
WWW-Authenticate lorsqu'il présente plus d'un modèle d'authentification, ou si plusieurs
EISTI / Fremaux 61 W3C / Berners Lee
RFC 1945WWW-Authenticate
champs - HTTP 1.0 / FR / VE:DOC OR:05/96
apparaissent dans l'en-tête, le contenu d'un - FR:10/97
modèle pouvant lui
même apparaître comme une liste de paramètres séparés par une virgule.
Scheme-auth = nom_de_scheme
Le message de réponse 401 (non autorisé) est utilisé par un serveur origine pour soumettre
le "modèle" d'authentification à un client. Cette réponse doit comporter un champ d'en-tête
WWW-Authenticate proposant au moins un modèle valide pour la ressource à atteindre.
L'attribut de domaine (indépendant de la casse) est requis dans tous les schèmes
d'authentification qui soumettent un modèle. L'espace de domaine (indépendant de la casse),
combiné à l'URL canonique du serveur origine, définit l'espace protégé. Cette technique permet
de partitionner un serveur protégé en plusieurs sous ensembles, protégés individuellement,
chacun avec leur propre modèle et leurs propres paramètres d'autorisation liées ou non à une
base de donnée d'authentification. Le domaine accessible est exprimé sous forme de chaîne
de caractères, en général donnée par le serveur origine, avec éventuellement une sémantique
supplémentaire dépendant du modèle d'authentification.
Un utilisateur désireux de s'authentifier auprès d'un serveur – en général, mais pas
nécessairement, après avoir reçu une réponse 401—peut le faire en spécifiant un champ
Authorization dans l'en-tête de sa requête. La valeur dans le champ Authorization consiste
contient l'accréditif nécessaire à l'accès au domaine autorisé pour la ressource visée.
Le domaine accessible par un utilisateur utilisant cet accréditif est déterminé par les données
de protection du serveur. Si une requête précédente à abouti à une autorisation d'accès, le
même accréditif donnera accès au même domaine accessible durant un temps déterminé par
EISTI / Fremaux 63 W3C / Berners Lee
RFC 1945 - d'authentification,
le modèle HTTP 1.0 / FR / VE:DOC OR:05/96 -Sauf
ses paramètres, et/ou les préférences utilisateur. FR:10/97
mention
explicite dans le modèle, un espace protégé ne peut sortir du cadre du serveur qui le gère.
Sur toute réception d'une requête non autorisée visant une URI dans l'espace protégé, le
serveur doit renvoyer une demande d'identification de forme:
dans laquelle "WallyWorld" est le nom symbolique de l'espace contenant l'URI-visée, attribué
par le serveur.
Pour obtenir l'autorisation d'accès, le client enverra l'user-ID et le mot de passe, séparatés
par un "deux-points" (":"), le tout encodé en base64 [5].
Si le client voulait utiliser l'user-ID "Aladdin" et le mot de passe "open sesame", il spécifierait
le champ ainsi:
Le modèle de base ci-défini est une méthode non sécurisée de filtrage d'accès à des
ressources données sur un serveur HTTP. Il suppose en effet que la connexion entre
l'utilisateur et le serveur est un lien digne de confiance. Ceci n'est pas le cas sur des réseaux
ouverts, et ce modèle doit être utilisé en connaissance de cause. Malgré cette faiblesse, les
clients devront implémenter ce modèle afin de pouvoir communiquer avec les serveurs qui
l'utilisent.
12. Sécurité
Cette section est une information à destination des développeurs d'applications, hébergeurs
de données, et des utilisateurs, concernant les limites de sécurisation atteintes par HTTP/1.0
tel que décrit dans ce document. La discussion suivante ne prétend pas apporter de solution
opérationnelle aux défauts qui y sont révélés, bien que quelques suggestions y soient faites
pour réduire le risque informatique.
13. Crédits
14. Bibliographie
[1] Anklesaria, F., McCahill, M., Lindner, P., Johnson, D., Torrey, D., and
B. Alberti, "The Internet Gopher Protocol: A distributed document
search and retrieval protocol", RFC 1436, University of Minnesota,
March 1993.
[2] Berners-Lee, T., "Universal Resource Identifiers in WWW: A Unifying
Syntax for the Expression of Names and Addresses of Objects on the
Network as used in the World-Wide Web", RFC 1630, CERN, June 1994.
[3] Berners-Lee, T., and D. Connolly, "Hypertext Markup Language - 2.0",
RFC 1866, MIT/W3C, November 1995.
[4] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform Resource
Locators (URL)", RFC 1738, CERN, Xerox PARC, University of Minnesota,
December 1994.
[5] Borenstein, N., and N. Freed, "MIME (Multipurpose Internet Mail
Extensions) Part One: Mechanisms for Specifying and Describing the
Format of Internet Message Bodies", RFC 1521, Bellcore, Innosoft,
September 1993.
[6] Braden, R., "Requirements for Internet hosts - application and
support", STD 3, RFC 1123, IETF, October 1989.
[7] Crocker, D., "Standard for the Format of ARPA Internet Text Messages",
STD 11, RFC 822, UDEL, August 1982.
[8] F. Davis, B. Kahle, H. Morris, J. Salem, T. Shen, R. Wang, J. Sui, and
M. Grinbaum. "WAIS Interface Protocol Prototype Functional
Specification." (v1.5), Thinking Machines Corporation, April 1990.
[9] Fielding, R., "Relative Uniform Resource Locators", RFC 1808, UC
Irvine, June 1995.
[10] [14]
[11]
[12]
[13]
R
.
A
d
a
m
s
,
"
S
t
a
n
d
a
r
d
f
o
r
i
n
t
e
r
c
h
a
n
g
eEISTI / Fremaux 73 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
Postel, J., and J. Reynolds, "File Transfer Protocol (FTP)", STD 9, RFC
959, USC/ISI, October 1985.
[15]
Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, RFC 1700,
USC/ISI, October 1994.
[16]
Sollins, K., and L. Masinter, "Functional Requirements for Uniform
Resource Names." RFC 1737, MIT/LCS, Xerox Corporation, December 1994.
[17]
US-ASCII. Coded Character Set - 7-Bit American Standard Code for
Information Interchange. Standard ANSI X3.4-1986, ANSI, 1986.
[18]
ISO-8859. International Standard -- Information Processing --
8-bit Single-Byte Coded Graphic Character Sets --
Part 1: Latin alphabet No. 1, ISO 8859-1:1987.
Part 2: Latin alphabet No. 2, ISO 8859-2, 1987.
Part 3: Latin alphabet No. 3, ISO 8859-3, 1988.
Part 4: Latin alphabet No. 4, ISO 8859-4, 1988.
Part 5: Latin/Cyrillic alphabet, ISO 8859-5, 1988.
Part 6: Latin/Arabic alphabet, ISO 8859-6, 1987.
Part 7: Latin/Greek alphabet, ISO 8859-7, 1987.
Part 8: Latin/Hebrew alphabet, ISO 8859-8, 1988.
Part 9: Latin alphabet No. 5, ISO 8859-9, 1990.
Tim Berners-Lee
Director, W3 Consortium
MIT Laboratory for Computer Science
545 Technology Square
Cambridge, MA 02139, U.S.A.
Roy T. Fielding
Department of Information and Computer Science
University of California
Irvine, CA 92717-3425, U.S.A.
Appendices
Ces appendices ont été ajoutés par souci d'information – Ils ne forment pas partie intégrante
de la spécification HTTP/1.0.
version: Version du protocole HTTP utilisé pour le message courant (e.g., "1.0"). Si ce
paramètre est absent, la version peut être déduite par analyse de la première ligne du corps.
B. Applications tolérantes
Bien que ce document donne toutes les spécifications pour la génération de messages
HTTP/1.0, toutes les applications ne présenteront pas une implémentation correcte. Nous
recommandons de ce fait que les applications opérationnelles puissent tolérer certaines
déviation de ce protocole, dans la mesure où celles-ci gardent un caractère univoque.
Les clients devront faire preuve de tolérance dans l'interprétation de la ligne d'état. Les
serveurs devront à leur tour se montrer ouverts dans l'interprétation de la ligne de Requête. En
particulier, ils devront accepter tout nombre d'espaces ou de tabulations entre les champs,
même lorsqu'un espace simple est requis.
La fin de ligne dans les en-têtes HTTP est marquée par la séquence CRLF. Cependant,
nous conseillons aux applications interprétant de telles en-têtes de reconnaître une fin de ligne
sur LF simple en ignorant le CR de tête.
D. Fonctions supplémentaires
Cet appendice liste quelques éléments de protocole parfois employés dans certaines
implémentations HTTP, mais qui ne sont pas considérées comme "légitimes" par la plupart des
applications HTTP/1.0. Les développeurs ont un intérêt à connaître ces fonctions, mais ne
peuvent être sûrs de leur présence effective, ni de leur implémentation par d'autres applications
HTTP/1.0.
D.1.1 PUT
La méthode PUT demande à ce que l'entité jointe soit enregistrée par le serveur sous
l'URI-visée. Si cette URI pointe vers une ressource déjà existante, l'entité jointe sera considérée
comme une nouvelle version de celle jusqu'alors présente sur le serveur origine. Si l'URI-visée
pointe sur une ressource inexistante, et à la condition que cette URI puisse être définie en tant
que nouvelle ressource du serveur, ce dernier créera une nouvelle ressource sous cette URI.
La différence fondamentale entre les méthodes POST et PUT réside dans la signification
donnée à l'URI-visée. Celle-ci, pour une méthode POST désigne la ressource "active" à
laquelle l'entité doit être confiée dans le but d'un traitement. Cette ressource peut être un
programme, un routeur ou un autre protocole, ou encore une entité acceptant des annotations.
Par contre, L'URI précisée dans une méthode PUT nomme l'entité incluse dans la requête – Le
client sait parfaitement de quelle URI il s'agit et le serveur n'applique la méthode à aucune
autre ressource.
D.1.2 DELETE
La méthode DELETE demande au serveur de supprimer la ressource pointée par
l'URI-visée.
D.1.3 LINK
La méthode LINK établit une ou plusieurs liaisons entre la ressource existante définie par
l'URI-visée et d'autres ressources.
D.2.1 Accept
Le champ d'en-tête Accept (requête) peut être utilisé pour définir une liste de types de média
acceptés en réponse à la requête. L'astérisque "*" est utilisée pour grouper des types de média
par classe, "*/*" indiquant tous les types de média, et "type/*" indiquant tous les sous-types du
type "type". La gamme de types signalée par le client sert essentiellement à limiter les
documents à des types acceptables par le client dans le contexte de la requête formulée.
D.2.2 Accept-Charset
Le champ d'en-tête Accept-Charset (requête) peut être utilisé pour former une liste de tables
de caractères préférentielles, autres que les tables US-ASCII et ISO-8859-1 utilisées par
défaut. Ce champ permet à un client de signaler à un serveur qu'il sait accepter d'autres
représentations de texte que les représentations par défaut, et est donc en mesure d'exploiter
des documents encodés avec ces tables, si le serveur sait les transmettre.
D.2.3 Accept-Encoding
Le champ d'en-tête Accept-Encoding (requête) est similaire au champ Accept, mais restreint
la gamme de valeurs Content-Coding attendues dans une réponse.
D.2.4 Accept-Language
Le champ d'en-tête Accept-Encoding (requête) est similaire au champ Accept, mais restreint
la gamme de langues attendues dans une réponse.
D.2.5 Content-Language
Le champ d'en-tête Content-Language (entité) décrit la ou les langues naturelles des
destinataires potentiels du corps d'entité. Notez que ceci n'a aucun lien avec les langues
utilisées dans l'ensemble de l'entité.
D.2.6 Link
Le champ d'en-tête Link (entité) permet de décrire les liaisons entre l'entité jointe et d'autres
ressources. Une entité peut se voir attribuer plusieurs valeurs pour le champ Link. Un champ
Link, au niveau métainformation, indique typiquement des relations du type dépendance
hiérarchique ou des chemins d'accès.
D.2.7 MIME-Version
Les messages HTTP peuvent inclure un champ unique d'en-tête générale indiquant quelle
version du protocole MIME a été employé pour construire le message. L'utilisation de ce champ
MIME-Version, tel que décrit par la RFC 1521 [5], peut indiquer si le message est compatible
MIME. Malheureusement, certaines premières implémentations de serveurs HTTP/1.0 émettent
ce champ sans réserve. Il est conseillé de l'ignorer.
D.2.8 Retry-After
Le champ d'en-tête Retry-After (réponse) peut être utilisé dans une réponse 503 (service
indisponible) dans le but d'indiquer pendant combien de temps (estimé) le service restera
indisponible aux requêtes du client. La valeur de ce champ peut être une date HTTP ou un
nombre entier de secondes (en décimal) à partir de l'heure de la réponse.
EISTI / Fremaux 80 W3C / Berners Lee
RFC 1945 - HTTP 1.0 / FR / VE:DOC OR:05/96 - FR:10/97
D.2.9 Title
D.2.10 URI
Le champ d'en-tête URI (entité) peut contenir toute ou partie des Uniform Resource
Identifiers (Section 3.2) par laquelle la ressource définie par l'URI-visée peut être identifiée.
Aucune garantie n'est cependant donnée que la ressource soit effectivement accessible par
l'une des URI spécifiées.