HTTP 1.1
Transcription
HTTP 1.1
HTTP 1.1 HyperText Transfer Protocol • Place de http dans le modèle osi : +773 ... ... TCP IP ... ... • HTTP est un protocole « sans état » : • chaque page WEB est transmise dans une connexion séparée (sauf pour les connections persistantes). Benoît Charroux - http 1.1 - janvier 2001 - 2 Gestion de la requête du client Les requêtes HTTP • Le format d’une requête d’un client : commande HTTP (GET, POST, HEAD, …) adresse du document : URL version du protocole GET /index.html HTTP/1.0 En-têtes User-Agent: Mozilla/4.0 (Compatible; MSIE 4.0; Windows 95) Accept: image/gif, image/jpeg, text/*, */* Ligne vide Données éventuelles (commande POST) Benoît Charroux - http 1.1 - janvier 2001 - 4 Les commandes (méthodes) • GET : • permet d’obtenir des informations (document, graphique, le résultat d’une requête dans une base de données, …) ; • peut envoyer des informations dans l’URL limités en taille à 240 caractères sur certains serveurs (données d’un formulaire simple) ; • POST permet de poster des informations (une données graphique, des données pour une base de données, …) en quantité illimité ; • HEAD pour demander les en-têtes de la réponse seulement pour récupérer la taille des documents, l’heure de modification, … • PUT et DELETE sont faîtes pour agir sur les documents du serveur (elles ne sont pas largement supportées à cause des problèmes de sécurité ; • TRACE retourne le contenu exact de la demande (utilisée pour le débogage) ; • OPTIONS pour demander au serveur les méthodes et les options qu’il supporte. Benoît Charroux - http 1.1 - janvier 2001 - 5 Les en-têtes HTTP 1/4 • Les en-têtes apportent des informations sur ce que sait faire un navigateur ; • les en-têtes http sont différentes des données d’un formulaire (envoyées dans l’URL pour les requêtes GET ou sur une ligne séparée pour les requêtes POST) ; • les en-têtes http sont envoyées par le navigateur immédiatement après les requêtes GET ou POST ; • exemples d’en-têtes : • Accept (types Multipurpose Internet Mail Extension que le navigateur sait gérer) ; • Connection (connection http persistante). Benoît Charroux - http 1.1 - janvier 2001 - 6 Les en-têtes HTTP 2/4 • Accept : type MIME qu’un client sait gérer (application/pdf, image/jpeg, …) ; • Accept-Charset : jeu de caractères (ISO-8859-1, …) ; • Accept-Encoding : type de compression qui peut être décodée (gzip, compress, …) ; • Accept-Langage : fr par exemple ; • Authorization : accéder à des pages WEB protégés par mot de passe ; • Cache-Control : • Connection : gestion des connexions http persistantes pour récupérer un fichier HTML et plusieurs pages associées en une seule connexion de socket (option par défaut) ; • Content-Length : taille des données d’une requête POST en octets (voir getContentLength) ; • Content-type : utilisée par un client quand un document est attaché à POST ; • Cookie : pour renvoyer au serveur un cookie qu’il a envoyé ; Benoît Charroux - http 1.1 - janvier 2001 - 7 Les en-têtes HTTP 3/4 • Expect : demande d’acquittement au serveur d’un document attaché ; • From : adresse e-mail de la personne responsable de la requête (pas envoyée par les navigateurs mais par les robots de recherche sur le WEB) ; • Host : nom d’hôte en numéro de port du client ; • If-Match et If-None-Match : • If-Modified-Since : la page sera transmise au client uniquement si elle a été modifiée après une date spécifiée (elle pourra ainsi être mis en mémoire cache par le navigateur) (voir getLastModified), il existe aussi If-Unmodified-Since ; • If-Range et Range : • Pragma : un servlet servant de serveur proxy doit transmettre la requête même s’il dispose d’une copie locale ; • Proxy-Authorization : authentifie un client auprès d’un serveur proxy ; Benoît Charroux - http 1.1 - janvier 2001 - 8 Les en-têtes HTTP 4/4 • Referer : indique l’URL de la page WEB à partir de laquelle la requête a été émise (peut être facilement maquillée) ; • Upgrade : spécifie un protocole autre que HTTP 1.1 ; • User-Agent : identifie le navigateur ou le client ; • Via : défini par les passerelles et les serveurs proxy par lesquels la requête passe ; • ... Benoît Charroux - http 1.1 - janvier 2001 - 9 Lire les en-têtes HTTP avec une servlet Lire les en-têtes HTTP 1/2 Récupère le contenu d’une en-tête (Connection par exemple) si elle est présente dans le requête. HttpServletRequest String getHeaderParameter( String nomEnTete ) getCookies A utiliser avec les méthodes qui retourne une date comme If-Modified-Since pour convertir en un long. getAuthType et getRemoteUser getContentLength getContentType Retourne la valeur d ’un entête comme un int. long getDateHeader( String nom ) int getIntHeader( String nom ) Retourne la valeur d’un en-tête. Enumeration getHeaderNames() int getHeader( String nom ) Enumeration getHeaders( String nom ) Retourne les valeurs des en-têtes qui peuvent apparaître plusieurs fois comme Accept-Langage. Benoît Charroux - http 1.1 - janvier 2001 - 11 Lire les en-têtes HTTP HttpServletRequest 2/2 Retourne la méthode principale de la requête (GET, POST, HEAD, PUT ou DELETE). String getMethod() String getRequestURI() Retourne la partie de l’URL située après l’hôte et le port mais avant les données du formulaire. Benoît Charroux - http 1.1 - janvier 2001 - 12 Exemple : lire toutes les en-têtes HTTP 1/2 public class EnTeteHTTP extends HttpServlet{ public void doGet( HttpServletRequest requete, HttpServletResponse reponse ) throws ...{ reponse.setContentType( "text/html" ) ; PrintWriter out = reponse.getWriter() ; String enTete ; for( Enumeration enTetes = requete.JHW+HDGHU1DPHV; enTetes.hasMoreElements(); ){ enTete = (String)enTetes.nextElement() ; out.println( enTete + "=" + requete.JHW+HDGHU(enTete) + "<BR>" ) ; } } public void doPost( HttpServletRequest requete, HttpServletResponse reponse ) throws ...{ doGet( requete, reponse ) ; } } Benoît Charroux - http 1.1 - janvier 2001 - 13 Exemple : lire toutes les en-têtes HTTP 2/2 • Résultats fournis par la servlet précédente : accept=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* accept-charset=iso-8859-1,*,utf-8 accept-encoding=gzip host=pc-charroux accept-language=fr connection=Keep-Alive user-agent=Mozilla/4.7 [fr] (WinNT; I) Benoît Charroux - http 1.1 - janvier 2001 - 14 Génération de la réponse du serveur Le format de la réponse d’un serveur • La réponse d’un serveur est composée : • d’une ligne d’état ; • des en-têtes de réponse ; • d’une ligne vide ; Code d’état. Message associé. • du document. • Exemple : En-tête de réponse (ContetntType est la seule obligatoire, sinon elles peuvent apparaître dans n’importe quel ordre). HTTP/1.1 200 OK Content-Type: text/plain Coucou ! Il n’y a pas toujours un document (réponse aux requêtes HEAD par exemple, ou cas des erreurs). Benoît Charroux - http 1.1 - janvier 2001 - 16 Les codes d’états • Les codes d’état sont classés en 5 catégories : • 100 à 199 : le client doit répondre avec une autre action ; • 200 à 299 : la requête à réussi ; • 300 à 399 : fichiers déplacés ayant une en-tête Location précisant leurs nouvelles adresses ; • 400 à 499 : erreur au niveau du client ; • 500 à 599 : erreur au niveau du serveur ; Benoît Charroux - http 1.1 - janvier 2001 - 17 Exemples de codes d’états • 200 (OK) : code envoyé par défaut (si on n’utilise pas setStatus) ; • 204 (No Content) : demande au navigateur de continuer d’afficher le document précédant car aucun nouveau documents n’est disponible ; • 205 (Reset Content) : il n’y a pas de nouveau document mais le navigateur doit remettre à jour l’affichage du document (utilisé pour effacer les champs des formulaires) ; • 302 (Found) : le document demandé se trouve ailleurs ; possibilité de rediriger automatiquement un navigateur sur une URL (méthode sendRedirect de HttpServletResponse) ; • 400 (Bad Request) : erreur de syntaxe dans le requête du client ; • 404 (Not Found) : aucune ressource n’est présente à l’adresse demandée par le client (méthode sendError de HttpServletResponse) ; • 500 (Internal Server Error) : souvent du à des programmes CGI ou des servlets en erreur qui envoient des en-têtes de format incorrecte. Benoît Charroux - http 1.1 - janvier 2001 - 18 Spécifier un code d’état dans une servlet Spécifier un code d’état HttpServletResponse SC_NO_CONTENT SC_NOT_FOUND Constante à utiliser comme code d’état. ... setStatus( int codeEtat ) sendError( int status ) Spécifier le code d’état à envoyer (appeler avant d’utiliser un PrintWriter pour envoyer l’en-tête et le document). sendRedirect( String URL ) Spécifier un code d’état à envoyer accompagné d’un message formaté dans un document HTML public class Redirection extends HttpServlet{ public void doGet( HttpServletRequest requete, HttpServletResponse reponse ) throws ...{ reponse.setContentType( "text/html" ) ; PrintWriter out = reponse.getWriter() ; UHSRQVHVHQG5HGLUHFWKWWSZZZELGRQIU } } Benoît Charroux - http 1.1 - janvier 2001 - 20 Quelques en-têtes de réponse HTTP 1.1 (1/4) • Vérifier quel protocole supporte le client avec getRequestProtocol avant d’utiliser les nouvelles en-têtes de HTTP 1.1 ; • Cache-Control (HTTP1.1) : indique si le document envoyé peut être mis en mémoire chache chez le client, les valeurs possible concernant le document envoyé sont : • public : peut être mis en mémoire ; • private : ne peut être socké que dans une mémoire tampon privée ; • no-chache : ne doit jamais être mis en mémoire tampon (normalement les navigateurs ne mettent pas en mémoire tampon les documents dont un formulaire est à l’origine) ; • no-store : ne doit pas être mis en mémoire tampon, QLGDQVXQHPSODFHPHQW WHPSRUDLUHVXUOHGLVTXHGXU ; • ... Benoît Charroux - http 1.1 - janvier 2001 - 21 Quelques en-têtes de réponse HTTP 1.1 (2/4) • Connection (valeur close) : demande au navigateur de ne pas utiliser les connexions HTTP persistantes (choisies par défaut avec HTTP1.1 si l’en-tête Content-Length est présente dans le réponse) ; • Content-Length (nécessaire uniquement pour les connexion persistante) : nombre d’octets de la réponse ; • Content-Location (HTTP1.1) : fournit une autre adresse pour le document demandé ; • Content-Type (type MIME, voir méthode setContentType) : les types MIME sont de la forme type-principal/sous-type (un x dans le sous-type indique un type non officiel): • application/msword ; • application/octet-stream (données binaires ou inconnues) ; • application/pdf ; • application/x-gzip ; Benoît Charroux - http 1.1 - janvier 2001 - 22 Quelques en-têtes de réponse HTTP 1.1 (3/4) • suite des types MIME : • application/x-java-archive (fichier JAR) ; • application/x-java-serialized-object ; • application/x-java-vm (fichier .class Java) ; • audio/midi ; • text/html ; • text/plain (text brut) ; • image/jpeg ; • video/mpeg ; • … • Expires (voir setDateHeader) : heure à laquelle le document ne doit plus être conservé en mémoire tampon ; Benoît Charroux - http 1.1 - janvier 2001 - 23 Quelques en-têtes de réponse HTTP 1.1 (4/4) • Expires (voir setDateHeader) : heure à laquelle le document ne doit plus être conservé en mémoire tampon ; • Last-Modified : date de dernière modification du document (le client peut mettre en mémoire le document et en fournir une date dans un en-tête If-Modified-Since, il recevra soit un nouveau document mis à jour, soit un code d’état 304 (Not modified); • Refresh (propre à Netscape et Internet Explorer) : indique dans combien de temps (en secondes) le navigateur doit demander une page mise à jour (utiliser setIntHeader("Refresh",temps)), toute les réponse doivent contenir Refresh (envoyer un code d’état 204 (No Content) pour ne pas effectuer le prochain chargement) ; • Set-Cookie (utiliser addCookie) : • ... Benoît Charroux - http 1.1 - janvier 2001 - 24 Envoyer des en-têtes de réponse ServletResponse setContentType( String type ) setContentLength( int len ) HttpServletResponse setHeader( String nom, String valeur ) Pour spécifier les en-têtes les plus courantes. Spécifier l’en-tête à envoyer (appeler avant d’utiliser un PrintWriter pour envoyer un document). setDateHeader( String nom, long date ) setIntHeader ( String nom, int valeur ) Envoi d’un en-tête avec conversion. addCookie( Cookie cookie ) sendRedirect( String URL ) • Les méthodes addHeader, addDateHeader et addIntHeader ajoute une nouvelle occurrence d’un en-tête à une liste existante. Benoît Charroux - http 1.1 - janvier 2001 - 25 Obtenir des informations sur le serveur et sur le client Obtenir des informations sur le serveur ServletRequest String getServerName() String getServerPort() Retourne le nom du serveur (par exemple www.coucou.com) à chaque requête pour les serveurs ayant plus d’un nom (virtual hosting). interface Servlet ServletContext String getServerInfo() abstract GenericServlet ServletContext getServletContext() getAttributes() Retourne le nom et la version du logiciel serveur. Benoît Charroux - http 1.1 - janvier 2001 - 27 Obtenir des informations sur le client ServletRequest String getRemoteAddr() String getRemoteHost() Retourne des informations sur la socket qui connecte le client au serveur (peut être un serveur proxy). interface Servlet ServletContext String getServerInfo() abstract GenericServlet ServletContext getServletContext() getAttributes() Retourne le nom et la version du logiciel serveur. Benoît Charroux - http 1.1 - janvier 2001 - 28 Obtenir des informations de chemin supplémentaire • Une requête peut inclure un chemin pour désigner en général un fichier sur le serveur : • dans l’URL (par exemple http://pc-charroux/servlet/MaServlet/index.html) ; • dans le paramètre ACTION d’un formulaire : Servlet <FORM METHOD=GET ACTION="/servlet/MaServlet/index.html"> HttpServletRequest Retourne le chemin supplémentaire. String getPathInfo() String getPathTranslated() Retourne le chemin réel qui complète le chemin supplémentaire. Benoît Charroux - http 1.1 - janvier 2001 - 29