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