Protocole HTTP (HyperText Transfer Protocol,):
Le protocole HTTP, est un protocole de communication client-serveur en mode déconnecté , développé pour le World Wide Web.
Il
est le protocole utilisé par les serveurs
WEB, par les navigateurs pour dialoguer avec les serveurs web, les ressources étant identifiées par des URI.
URI, de l'anglais Uniform Resource Identifier, soit littéralement identifiant uniforme de ressource, est une courte chaîne de caractères identifiant une ressource sur un réseau .
|
et doivent être remplacés par % puis le code ASCII (%20 pour l'espace, %2F pour le /, etc.)
HTTP a été inventé par Tim Berners-Lee avec les adresses Web et le langage HTML .
À cette époque, le FTP était déjà disponible pour transférer des fichiers, mais il ne supportait pas la notion de format de données telle qu'introduite par Multipurpose Internet Mail Extensions (MIME).
La première version de HTTP (0.9) était très élémentaire, mais prévoyait déjà le support d'en-têtes MIME pour décrire les données transmises.
la version actuelle est la 1.1 (Voir la rfc)
La liaison entre le client et le serveur n'est pas toujours directe, il peut exister des machines intermédiaires servant de relais :
Un serveur HTTP utilise par défaut le port 80 (443 pour HTTPS)
Au delà du serveur HTTP lui même, qui distribue des fichiers (souvent des pages html et des images), on peut ajouter du code de facon à produire des pages dynamiques
Exemple de dialogue HTTP :
Le client se connecte, puis utilise une méthode (comme une commande FTP) :
Une requête HTTP présente le format suivant : Ligne de commande (Commande, URL, Version de protocole) Les réponses HTTP présentent le format suivant : Ligne de statut (Version, Code-réponse, Texte-réponse) |
Voici un exemple de dialogue entre un client et le serveur WEB www.volubis.fr
telnet www.volubis.fr 80 Trying 192.168.67.200... Connected to www.volubis.fr. Escape character is '^]'. GET /index.html HTTP/1.1 Host: www.volubis.fr HTTP/1.1 200 OK Date: Tue, 03 Jan 2006 08:04:14 GMT Server: Apache/2.0.52 Last-Modified: Fri, 16 Dec 2005 15:33:13 GMT ETag: "17c3-e1c-eb594040" Accept-Ranges: bytes Content-Length: 3612 Connection: close Content-Type: text/html; charset=ISO-8859-1 <html> <head> <title><title>mon titre</title> </head> <body> ma premiere page </body> </html> |
Elles sont toujours présentes sous la forme :
Nom: valeur
En voici quelques-unes : (voyez la liste complète)
Host: www.volubis.fr
Spécifie le nom de domaine du site, par exemple s'il y a plusieurs sites à la même adresse IP.
Cookie: nom-cookie=valeur cookie
Permet d'envoyer au serveur les cookies qui ont été enregistrés. Un cookie à toujours un nom et une valeur. Pour en envoyer plusieurs, écrivez-les à la suite, séparés par un point-virgule.
Connection: Close|Keep-Alive
Définit le type de connexion :
Close : la connexion est fermée après la réponse
Keep-Alive : crée une connexion persistante. Avec ce type de connexion, il est même possible d'envoyer une requête sans attendre la réponse à la précédente.
Date: Tue, 03 Jan 2006 08:04:14 GMT
Date de génération de la réponse.
Server: Apache/2.0.52
Spécifie le modèle du serveur HTTP.
ETag
Permet de savoir si la version dans le cache du navigateur est toujours valide
Détail :
Principaux navigateurs : Chrome, Firefox, Safari, Internet Explorer
en mode commande :
wget (disponible sur IBMi avec 5733OPS et la PTF SI63051
curl (disponible sur IBMi avec 5733OPS et SI63905)
abréviation de client URL request library :
cette commande :
Pour obtenir l'entête d'une page :
Pour tester un web service par GET
(ici 404 , Not found)
Pour tester un web service par POST
curl -i -H "Content-Type: application/json" -X POST
-d '{"NOM":"Volubis", "VILLE":"Carquefou", "TEL":"02 40 30 00 70" , "FAX":"02 40 30 39 22", "APPEL_CODE":13}'
http://as400:10025/web/services/Producteur
Fonctions SQL pour simuler un client HTTP
Elles permettent de récuperer un BLOB (données binaires) ou un CLOB (du texte)
Regardons à travers des exemples
Values SYSTOOLS.HTTPGETCLOB('http://www.volubis.fr' ,'') ;
Récupère dans une variable le contenu de notre page d'accueil
Pour une page web "classique" , par formulaire
-> |
-- Appel d'une page PHP (normalement un formulaire avec "prenom") Values SYSTOOLS.HTTPPOSTCLOB('http://as400/php/exemples/tp/tp0.php' , CAST ('<httpHeader> <header name="Content-Type" value="application/x-www-form-urlencoded"/> </httpHeader>' AS CLOB(1K)), CAST('prenom=christian' AS CLOB(10K)) ) |
Le serveur WEB le plus connu et le plus utilisé est APACHE, il est disponible sur IBMi depuis la V5R10.
Le serveur d'administration, lancé par STRTCPSVR *HTTP HTTPSVR(*ADMIN), utilise le port 2001
Il permet de créer de nouveaux serveurs.
Dans le cas d'un serveur Apache, voici
les répertoires et les fichiers créés :
![]() |
|
détail de httpd.conf (version IBM i, tel que généré par l'assistant)
# Configuration originally created by Apache Setup Wizard Fri Jan 04 13:24:49 GMT |
Survol des principales Directives :
Listen 10.3.1.1:81 : adresse et port d'écoute
DocumentRoot /www/apache1/htdocs : localisation des pages html
DirectoryIndex index.html : définition de la (ou des )
page(s) d'accueil
par exemple :
LoadModule deflate_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM (module de
compression)
LoadModule jk_module /QSYS.LIB/QHTTPSVR.LIB/QZTCJK.SRVPGM (connecteur Tomcat)
ErrorLog logs/basic_error_log : localisation des historiques
d'erreur
LogFormat et CustumLog : format et localisation des historiques de consultation
BrowserMatch , identification des navigateurs (sur une
chaîne descriptive fournie par ce dernier)
cette directive permet de demander :
a/ à renseigner une (ou des) variable(s) d' environnement (variable=valeur).
b/ à utiliser certaines options spécifiques pour ce navigateur (NokeepAlive)
Options
ExecCGI, scripts CGI autorisés.
FollowSymLinks, autorise le serveur à suivre les liens symboliques dans IFS (résultat de la cde système ADDLNK)
SymLinksIfOwnerMatch, suivre les liens symboliques, si le propriétaire du lien est aussi le propriétaire de l'original.
Includes, autorise SSI ("include" ou copies de fichiers réalisées par le serveur à la volée)
IncludesNOEXEC, autorise SSI sauf dans le scripts CGI.
Indexes, autorise le serveur à produire une liste des documents d'un répertoire même s'il ne contient pas de fichier tel que définit dans DirectoryIndex (par défaut index.html)
Multiviews, autorise les documents à "contenu négocié", à l'affichage.
Il s'agit :
a/ de fichiers images, notés sans extensions, et le serveur envoi la plus petite des images trouvées et supportée par le navigateur (.gif ou .jpg)
b/ de fichiers texte dont l'extension présente la langue, le lien est noté toujours sans extension
(<A href="nom-du-fichier"...) et le fichier sera choisi selon la langue du navigateur
(.fr en français, .en en anglais, ...), par défaut cela n'est admis que pour les type mime connus
AddType, permet d'ajouter un type mime en précisant l'extension le caractérisant :
AddType application/x-httpd-php .php
Action, permet d'indiquer une action à entreprendre face à un type mime particulier
Action application/x-httpd-php /php-bin/php
(il faudra quand même avoir un ScriptAlias sur le répertoire /php-bin)
AddOutputFilterByType permet de demander un filtre de sortie (compression) par type MIME
AddOutputFilterByType
DEFLATE text/html
SetOutPutFilter DEFLATE
(il faut avoir chargé le module deflate_module, voir plus haut)
AddOutputFilter permet de demander un filtre de sortie (compression) par extension de fichier
AddOutputFilter DEFLATE
.htm
SetOutPutFilter DEFLATE
Alias, permet de masquer la localisation réelle d'un ensemble de fichiers,en fournissant d'abord le nom d'un répertoire "virtuel", puis le nom du répertoire réel à utiliser (permet de masquer l'emplacement réel, mais aussi de "sortir" du répertoire indiqué par documentroot)
Alias /images/ /html/images/
ScriptAlias, idem, pour les programmes CGI, par exemple :
ScriptAlias /cgi-bin/netdata/ /qsys.lib/cgi.lib/db2www.pgm/
ScriptAlias /php-bin/ /QOpenSys/php/bin/
Redirect, redirige la demande vers une autre URL en
précisant un code erreur HTTP
(le navigateur recoit le code http et la nouvelle URL et se redirige
alors vers cette dernière)
301 : Move permanently 302 : Move temporarily 410 : Gone (la nouvelle url ne doit pas être précisée)
Redirect 302 /as400 http://www.iseries.com/as400
Redirect 301 /unix http://www.linux.fr
ProxyPass / ProxyPassReverse, le serveur Apache interroge pour
vous un autre serveur, récupère la réponse et la fournit
au client d'origine (proxy inversé),
Utilisé avec ZendCore, de facon à rediriger les requêtes
vers le serveur Apache d'unix (sur le port 8000)
ProxyPass /php http://localhost:8000/exemplesphp
ProxyPassReverse /php http://localhost:8000/exemplesphpil faut impérativement avoir chargé le module correspondat par
LoadModule proxy_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
LoadModule proxy_http_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
<Directory> </Directory>, il s'agit d'un bloc donnant des droits et des options pour un répertoire uniquement.
vous devez placer vos directives entre <directory> et </directory> afin qu'elles ne portent que sur UN répertoire précis,
particulièrement :Options (vu plus haut)
ATTENTION :
Option +ExecCGI, ajoute le droit de lancer des scripts
Option ExecCGI, donne le droit de lancer des scripts, mais RETIRE les autres options (annule et remplace)
Vous pouvez aussi utiliser les options avec le signe "-".order, qui détermine vos priorités
allow,deny: tout ce qui n'est interdit est autorisé
deny,allow : tout ce qui n'est pas autorisé est interditallow from , indiquez all ou une adresse ip ou un début d'adresse, pour autoriser un répertoire à certains postes.
deny from, identique à allow (sur le plan de la syntaxe), indique les postes NON autorisés.
sur le même mode, vous trouverez
<Files> </Files> liste des directives liées à un fichier
<Location> </Location> liste des directives
liées à une URL et non une localisation (avant réécriture,
par ScriptAlias par ex.)
Depuis les versions 7.1, 7.2 vous pouvez faire tourner le serveur Apache dans un sous-système séparé (et non QHTTPSVR)
pour cela
Pour mesurer la capacité de montée en charge de votre serveur HTTP, utilisez JMETER (http://jmeter.apache.org/)
Lancez jmeter.bat ou jmeter.sh
Ajoutez un groupe d'unités (Thread) représentant un nombre de client simultanés
Une configuration HTTP par défaut, contenant l'URL du serveur
S'il le faut des entêtes HTTP à transmettre
ici la clause Accept pour recevoir du Json
Un gestionnaire de cache, si vous voulez vider le cache à chaque requête
Une ou plusieurs variables aléatoires (si besoin)
Vous y ferez référence par ${prod}
insérez ensuite des requêtes à soumettre au serveur HTTP
Par exemple
Eventuellement plusieurs
Puis des récepteurs qui afficherons les résultats
Sauvegardez et lancez
Arbre de résultat | |
Graphique | |
Rapport agrégé |
Au final vous trouverez vos temps de réponse moyen, la valeur médianne, etc...