Nouvel objet abstrait Io:Cgi
Ajout d'un nouvel objet abstrait Cgi dans le module Io. Ce module est destiner à faciliter la création de scripts CGI en Abstrasy.
Le choix du CGI se justifie par sa facilité d'implémentation et son indépendance par rapport au serveur HTTP. Nous prendrons comme serveur de référence le serveur Apache, mais le composant devrait être compatible avec tous serveurs qui supporte le CGI.
Blueprint information
- Status:
- Complete
- Approver:
- Luc Bruninx
- Priority:
- Medium
- Drafter:
- Luc Bruninx
- Direction:
- Approved
- Assignee:
- Luc Bruninx
- Definition:
- Approved
- Series goal:
- Accepted for 1.0
- Implementation:
- Implemented
- Milestone target:
- abstrasy-1.0.6339.0
- Started by
- Luc Bruninx
- Completed by
- Luc Bruninx
Related branches
Related bugs
Sprints
Whiteboard
La possibilité de disposer d'un délimiteur de chaînes de caractères littérales multi-lignes est nécessaire pour facilité l'insertion de contenu textuel (notamment HTML).
Les méthodes :write! et :writeln! devraient être adaptées pour être conforme à la forme syntaxique de display.. et display.
L'objet Cgi est destiné à faciliter l'utilisation de script comme CGI.
Ainsi, lors de l'instanciation d'un nouvel objet abstrait Io:Cgi, l'interface de son adaptateur capture les paramètres de la requête dans une liste associative :Form.
Dans le cas d'une requête GET, chaque clé est associée à la valeur qui lui correspond. Par exemple si on accède au script "cgi.abstrasy?
Dans le cas où une clé est mentionnée plusieurs fois dans l'url, une liste est associée à la clé. Par exemple, "cgi.abstrasy?
Enfin, lorsque la clé est mentionnée seule, NOTHING lui est associée. Par exemple, "cgi.abstrasy?
Le processus est identique pour un POST(applicatio
On note aussi que les en-têtes doivent être envoyée avec un 'End-Of-Line' (EOL) du type CRLN et non simplement LN. Cette spécification doit être ajoutée à Io:File (Io:Cgi est dérivée de Io:File).
Io:Cgi propose la méthode :header! pour personnaliser les en-têtes HTTP retournées par le script CGI.
Cet exemple de script permet (dans la beta disponible dans le SVN) de produire une page d'erreur 404 personnalisée:
#!/usr/bin/env abstrasyc
#
# 404.abstrasy
#
# Utilisation des en-têtes HTTP (Io:File:Cgi)
# Création d'une page d'erreur 404 personnalisée.
# Utilisation de chaînes de caractères littérales multi-lignes.
#
(import 'Io provide 'Cgi)
(import 'Os provide 'System)
(using (new Cgi) do{
# Header
(:header! "Status" "404 Not found")
(:header! "Content-type" "text/html")
# Content
(:write!
`<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>The requested URI "` (:get-env "REQUEST_URI") `" was not found on this server.</p>
<hr>`
(:get-env "SERVER_SIGNATURE")
</body>
</html>`)
})
(exit)
Ce qui donne à très peut de chose prêt une page similaire à la page 404 par défaut du serveur Apache, sauf qu'ici nous la forgeons complètement.
Vous constaterez au passage l'usage de chaînes littérales multi-lignes.
Work Items
Work items:
Délimiteur de chaînes littérales multi-lignes : DONE
Conformité de :write et :writeln à display.. et display : DONE
Récupération des Méta-variables CGI standards : DONE
Méthode d'encodage SGML pour les caractères &,< et > : DONE
Récupération des données envoyée par POST dans un buffer : DONE
Parsing des paramètres obtenu par POST(applicatio
Parsing des paramètres QUERY_STRING envoyées par GET (urlencoded) : DONE
Parsing des données multipart/form-data obtenue à l'aide de POST : DONE
Gérer et envoyer des en-têtes (:header! str) et (header! fieldStr valueStr) : DONE
Support des Cookies : DONE
Dependency tree
* Blueprints in grey have been implemented.