Format d'échange des messages entre client et serveur

------------------------- début LIPE-RFC-0-4-a-----------------------
LIPE-RFC-N°   : 0-4
Status        : Provisoire rev. a
Date          : 25-10-99
Auteurs       : Bernard Frit  
Reference     : RFC 2068 (HTTP/1.1)
Sujet         : Format d'échange des messages entre client et serveur
Mots Clés     : RFC, LIPE, LIPE-RFC, spécifications, architecture,
                implémentation, répertoires, protocole de transport,
		Apache, HTTP
Destinataires : Architecture, 
Contenu       :

   Descriptif du Format des Messages Echangés entre Client et Serveur
   ==================================================================

Le format des messages est basé sur un sous-ensemble de la norme internet
HTTP/1.1 décrite dans le RFC 2068.

Le sous-ensemble retenu correspond à la méthode POST formatté selon
le type de contenu (Content-type) multipart/form-data pour les
messages dans le sens client vers serveur. Ce type de contenu
correspond à un message structué en plusieures parties et contenant
des données provenant d'un formulaire.

Dans le cas des messages dans le sens serveur vers client, le même
type de contenu est retenu.

Les messages du client vers le serveur sont appelés des requêtes;
les messages du serveur vers le client sont appelés des réponses;
il s'agit là de la dénomination officielle en HTTP/1.1.

Requêtes client vers serveur
============================

Le format ou le type de contenu retenu à savoir le 
Content-type: multipart/form-data permet de structurer les
requêtes vers le serveur en autant de parties que nécessaire.
Le contenu de chaque partie est totalement libre et n'est
absolument pas vérifié par Apache qui se charge de le transmettre
tel quel à l'URL demandé.

La séparation du message en plusieurs parties permet d'envoyer
des informations à destination du serveur dans la première partie
puis des informations à différents modules dans chacune des parties
suivantes.

o En-tête de la requête Header.

Nom de la ligne     Obligat.(1) Descritif  
-------------------------------------------------------------------
Request-line            OUI     Composé de :
                                Method (ici toujours POST) 
                                Espace
                                URI (uniform ressource identifier) 
				Espace
				HHTP-version (ici toujours HTTP/1.1)
                                CR-LF	

Connection		NON     Ici toujours égal à :
				Connection: Keep-Alive

User-Agent		NON	Nom du programme client par ex:
				User-Agent: LIPE Client v1.6.2 Linux 2.2.25	

Host                    OUI     Machine sur laquelle tourne le serveur ex:
				Host: lipe_server.lipe.com
										   	Content-type		OUI	Ici toujours égal à :	
				Content-type: multipart/form-data

boundary		NON(2)	Indique le séparateur entre les différentes
				parties du message. Il peut être intéressant
                                d'utiliser le séparateur pour identifier
                                la transaction et donc le séparateur serait
          			structuré ainsi :
				------
				par ex : boundary=-----56885689-1

Content-length		NON	Indique la longueur en octets de la requête
				peut être utile afin de faire un contrôle, mais
				ne doit pas être bloquant si inexistant.
				ex : Content-length: 725

CRLF			OUI	La fin de l'en tête est marquée par une ligne
				blanche.
  
Notes :
~~~~~~~
(1) Il s'agit ici de ce qui est obligatoire pour HTTP/1.1
(2) boundary peut-être omis; à ce moment là, la ligne qui suit
    la fin de l'en tête est considérée comme séparateur.

o Corps de la requête Body : partie destinée au serveur

Nom de la ligne     Obligat.(1) Descritif  
-------------------------------------------------------------------
boundary		OUI	Séparateur de partie
				ex : -----56885689-1

Content-Disposition	NON	Permet de donner un nom à la
				partie; par ex:
				Content-Disposition: form-data; name="lipe_header"

Session			***(2)	Spécifique à LIPE, c'est le numéro de
				session attribué par LIPE au login	
				Ex: Session: 56885689

Transaction		***	Spécifique à LIPE, c'est le numéro de
 				transaction incrémenté à chaque requête.
				Ex: Transaction: 1

Date			***	Spécifique à LIPE, c'est la date système
 				du client au format date système unix.
				Ex: Date: 31256

Time			***	Spécifique à LIPE, c'est l'heure système
 				du client au format heure système unix.
				Ex: Time: 12565

User			***	Spécifique à LIPE, c'est l'utilisateur LIPE 
				tel qu'identifié au Login.
				ex : User: Bernard

Module			***     Spécifique à LIPE, c'est le module LIPE 
				auquel il faut transmettre les datas.
				ex : Module: Saisie_Compta (3).

Notes :
~~~~~~~
(1) Il s'agit ici de ce qui est obligatoire pour HTTP/1.1
(2) Les *** indiquent qu'il s'agit là d'une ligne spécifique à LIPE
(3) Cette ligne peut-être répétée autant de fois qu'il y a de module
    auquel envoyer des datas.

o Corps de la requête Body : partie destinée au module

Nom de la ligne     Obligat.	Descritif  
-------------------------------------------------------------------
boundary		OUI	Séparateur de partie
				ex : -----56885689-1

Content-Disposition	NON	Permet de donner un nom à la
				partie; par ex:
				Content-Disposition: form-data; name="lipe_datas_1"

Module			***     Spécifique à LIPE, c'est le module LIPE 
				auquel il faut transmettre les datas.
				ex : Module: Saisie_Compta.

Datas			***	Spécifique à LIPE, il s'agit des datas
				à transmettre au module spécifié.
				Le format des datas est spécifique
				à chaque module. Par ex :
				Datas:
				FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
				00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
				etc...

Exemple :
--------- 
Saisie d'une écriture (simplifié) envoi du message depuis
le client vers le serveur. Voici ce que le client envoie :

POST /lipe/bin/lipe_server HTTP/1.1	
Connection: Keep-Alive			
User-Agent: LIPE Client v1.6.2 Linux 2.2.25	
Host: lipe_server.lipe.com
Content-type: multipart/form-data;	
boundary=-----56885689-277
Content-Length: xxxx

-----56885689-277
Content-Disposition: form-data; name="lipe_header"   
Session: 56885689
Ordre: 277
User: Bernard
Date: 31256
Time: 12565
Module: Ajoute_Ecrit			
-----56885689-277
Content-Disposition: form-data; name="lipe_datas_1"    
Module: Ajoute_Ecrit			
Datas:
411DUPON|Réglement Fac 2375|2350.25|C   # N°Compte|Libellé|Montant|Sens
51201000|Réglement Fac 2375|2350.25|D   # sans commentaire
-----56885689-277

Commentaire additionnel:
------------------------

POST /lipe/bin/lipe_server HTTP/1.1

Cette syntaxe suppose qu'il existe un fichier exécutable lipe_server
à http://lipe_server.chezmoi.fr/lipe/bin/lipe_server
On peut se contenter de

POST /usr/local/lipe/bin HTTP/1.1

Dès l'instant où il existe par exemple un fichier exécutable déclaré dans
la config d'Apache et associé à toute requête sur /usr/local/lipe/bin.

Réponse serveur vers client
===========================


--------------- fin LIPE-RFC-0-4-a-----------------------