Nouvel objet abstrait Io:Cgi

Registered by Luc Bruninx

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:
milestone icon abstrasy-1.0.6339.0
Started by
Luc Bruninx
Completed by
Luc Bruninx

Related branches

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?a=10&b=toto", cgi:Form = [<"a" "10><"b" "toto">].

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?a=10&a=20&b=toto" -> cgi:Form = [<"a" ["10" "20"]> <"b" "toto">].

Enfin, lorsque la clé est mentionnée seule, NOTHING lui est associée. Par exemple, "cgi.abstrasy?azerty" -> cgi:Form = [<"azerty" NOTHING>] .

Le processus est identique pour un POST(application/x-www-form-urlencoded).

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")
        `<address>CGI powered by Abstrasy ` (System:interpreter-version) `.` (System:interpreter-revision) `</address>
      </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(application/x-www-form-urlencoded) : DONE
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.

This blueprint contains Public information 
Everyone can see this information.

Subscribers

No subscribers.