Le Comportement des Navigateurs Internet


précédentsommairesuivant

II. La construction de la requête HTTP

II-A. Choix de la méthode

Maintenant que l'on connait l'adresse IP du serveur, on peut s'y connecter afin d'envoyer la requête HTTP adéquate. Cependant, avant d'envoyer la requête HTTP, il faut la construire.

En général, les navigateurs Web utilisent trois types de requêtes HTTP :
  • Les requêtes GET
  • Les requêtes POST application/x-www-form-urlencoded
  • Les requêtes POST multipart/form-data

Dans le cadre de certaines optimisations liées au cache, il est possible que le navigateur puisse exceptionnellement utiliser des requêtes HEAD. Toutefois, cette alternative est laissée à la discrétion du navigateur, sous réserve que le serveur accepte la méthode HEAD (et donc la version 1.1 du protocole HTTP). La construction de la requête se fait en plusieurs temps.

La Méthode GET

Les requêtes de type GET sont les plus fréquemment employées.

Elles sont utilisées quand :
  • Une URL est entrée directement dans la barre d'adresse
  • On clique sur un lien
  • On charge un document annexe à la page (frame, iframe, feuille de style, image, icône, fichier de script, etc.)
  • On soumet un formulaire utilisant la méthode GET
  • La réponse HTTP précédente a retourné un code status impliquant une redirection simple

La Méthode POST application/x-www-form-urlencode

Les requêtes de type POST application/x-www-form-urlencode sont utilisées à la soumission d'un formulaire dont la propriété enctype a la valeur application/x-www-form-urlencode (c'est la valeur par défaut).
Le format d'encodage des données est le même que pour les paramètres GET.

Les requêtes POST multipart/form-data

Ces requêtes sont utilisées à la soumission d'un formulaire dont la propriété entype est à multipart/form-data. Le format est plus complexe que pour les POST application/x-www-form-urlencode, car elles doivent permettre d'envoyer des fichiers en plus des données.
Il y a tout d'abord un élément essentiel, nommé le boundary. C'est une chaîne de caractères qui permet de servir de séparateur, son format et sa valeur sont laissés à la discrétion du navigateur. Il est spécifié à l'aide d'une en-tête dans la requête HTTP. Ensuite, chaque donnée de formulaire est indiquée de cette façon :

 
Sélectionnez
Content-Disposition: form-data; name="{NOM}"[CRLF]
[CRLF]
{VALEUR}

Tandis que les fichiers sont indiqués selon un format presque similaire :

 
Sélectionnez
Content-Disposition: form-data; name="{NOM}"; filename="{NOM DU FICHIER}"[CRLF]
Content-Type: {TYPE MIME}[CRLF]
[CRLF]
{CONTENT}

Le [CRLF] correspond à un retour à la ligne "\r\n". Le NOM et le NOM DU FICHIER ne doivent pas contenir de guillemet (") ni de retour à la ligne (\r ou \n).

Les données sont séparées par le boundary, qui est seul sur une ligne. De plus, l'ensemble des données est lui-même indiqué entre deux lignes ne contenant que le boundary.

II-B. Génération des en-têtes

Les en-têtes de la requête sont générées de plusieurs façons selon les en-têtes et la configuration.

Les en-têtes ne dépendant pas de la requête

Ces en-têtes sont envoyées par le navigateur à chaque requête, et ne dépendent pas de la dite requête.

  • User-Agent
    Cette en-tête indique le nom et la version du navigateur. Cela peut servir pour faire par exemple des statistiques sur les visiteurs, mais également à générer des pages optimisées pour le navigateur. Certains navigateurs (Opera par exemple) permettent de modifier leur signature afin de se "faire passer pour un autre navigateur".

  • Accept, Accept-language, Accept-charset et Accept-encoding Ces en-têtes permettent d'indiquer les types MIME, langues, jeu de caractères et encodages supportés par le navigateur, ils peuvent également être classés par préférence.

Les en-têtes dépendant de la requête

  • Host
    Cette en-tête permet d'indique le nom de domaine sur lequel s'effectue la requête, puisqu'en HTTP/1.1, un serveur peut héberger plusieurs noms de domaines.

  • Referer
    Cette en-tête permet d'indiquer la page chargée précédemment, celle qui a conduit à effectuer la requête courante. Certains navigateurs permettent de désactiver cette en-tête.

  • Cookie
    Si le navigateur est configuré pour les supporter, il va lister ici les cookies disponibles pour la page (un exemplaire de l'en-tête par cookie).

II-C. Cas de la soumission d'un formulaire : récupération des données

Quand un formulaire est soumis, les données associées sont récupérées puis envoyées au serveur dans le format approprié. Voici comment sont sélectionnées et regroupées les données.

Sélection des balises

En HTML, les balises susceptibles de contenir des données sont :
  • input
  • select
  • textarea

Celles dont la propriété disabled (désactivé) est spécifiée sont ignorées. Chaque balise est ensuite traitée selon le cas. Le nom est à chaque fois l'attribut name : s'il est vide, alors une chaîne vide est envoyée en tant que nom.

  • Les input button
    Ils ne sont pas destinés à être envoyés au serveur, mais uniquement à déclencher une action côté client.
    Ils sont ignorés.

  • Les input submit et image
    Si la soumission a été déclenchée par le clic sur un élément de ce type, il est alors communiqué au serveur, sinon il est ignoré. Si l'input ne possède pas d'attribut value, alors la valeur est laissée à l'appréciation du navigateur, sinon c'est elle qui est spécifiée. Pour les input image, les coordonnées du clique (par rapport au coin inférieur gauche) sont communiquées grâce à deux données supplémentaires dont les noms sont la valeur du name, suivi d'un underscore (_), suivi d'un x minuscule (coordonnée horizontale) ou d'un y minuscule (coordonnée verticale).

  • Les input checkbox et radio
    Seuls ceux qui sont cochés sont envoyés, s'il n'y a pas de valeur spécifiée (attribut value), alors le défaut est laissé à l'appréciation du navigateur (en général, c'est "on" qui est utilisé).

  • Les inputs text, hidden, password et les textarea
    Ces quatre types d'éléments sont traités de la même façon, la valeur est simplement celle entrée par l'utilisateur ou spécifiée dans l'attribut value (pour les inputs) ou entre les balises du textarea.

  • Les select
    Pour les select (multiple ou non), la (ou les) valeur(s) est (sont) l'attribut value de l' (des) option sélectionnée(s), ou à défaut, le contenu des balises.
    Dans le cas d'un select multiple, chaque valeur est envoyée avec le même nom. Si auncune valeur n'est sélectionnée, alors il est ignoré.

  • Les input file
    Les input file sont traités différemment selon la méthode de soumission. S'il s'agit d'un POST mutlipart/form-data, alors les données sont extraites comme indiqué dans la description de ce type de requêtes.
    Sinon, la valeur est simplement le nom du fichier (sans le chemin d'accès).

L'ordre des données

L'ordre est propre au navigateur. Cependant, aucune donnée ne doit être supprimée, même en cas de collision de nom, ou de nom absent.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2006 Mathieu Lemoine. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.