Rebol FastCGI: au secours!
Laurent7-Dec-2010/7:26:11+1:00
Bonjour à tous (toutes?). Je suis nouveau ici, j'ai découvert Rebol il y à quelques semaines et sa syntaxe m'a réconcilié avec la programmation à tel point que je n'ai plus envie de programmer dans un autre langage et ça je ne sais pas si c'est vraiment bien. La communauté a l'air sympa, alors je vous soumet mon problème qui me rend fou: fastcgi sous Rebol.

J'ai testé Cheyenne qui est vraiment extra et qui marche très bien avec le driver MySQL de DocKimbel, mais hélas le SSL server side dont j'ai besoin n'est pas implémenté, je me suis donc tourné vers nginx qui est le nouveau serveur web "unbloated" qui monte et qui ne marche qu'en fastcgi. J'ai donc acheté Rebol/command pour pouvoir faire du fastcgi et je suis atterré par le manque de documentation. Tout ce qu'on a c'est la page http://www.rebol.com/docs/fastcgi.html qui comporte une ENORME erreur qui m'a fait perdre un week-end, à savoir que pour récupérer les paramètres fastcgi il faut mettre

cgi-data: get-modes conn-port 'cgi

et pas

cgi-data: get-modes 'cgi conn-port

comme indiqué sur le site de Rebol. A croire que l'ami Carl le fait exprès!
Mais ce n'était que le début de mes problèmes car même si j'arrive maintenant à récupérer le contenu du POST, lorsque j'essaye d'écrire (write-io) sur le port j'ai une erreur nginx quand je clos la connexion (close conn-port):

2010/12/07 07:16:10 [error] 15749#0: *15 upstream closed prematurely FastCGI stdout while reading response header from upstream, client: ::1, server: localhost, request: "POST /cgi-bin/rebolfcgi.r HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost", referrer: "http://localhost/simple.html"

et au lieu de "clap clap" j'ai une superbe page HTML "502 Bad Gateway" de nginx qui s'affiche.
Mon process fastcgi rebol tourne bien pourtant, sans retourner d'erreur, le probe du contenu cgi est ok:

Contenu=
[Field: "si rebol marche bien tape dans tes mains" Submit: "Submit"]

Mon code, qui ne fait que reprendre celui de Carl (sans l'erreur!) est le suivant:

REBOL[title: "test fast-cgi rebol"]
listen-port: open fastcgi://:9000

html: make string! 2000

read-cgi: func [
/local data buffer
][
switch cgi-data/request-method [
"POST" [
data: make string! 1020
buffer: make string! 16380
while [positive? read-io conn-port buffer 16380][
append data buffer
clear buffer
]
]
"GET" [data: cgi-data/query-string]
]
data
]

forever [
conn-port: first listen-port
cgi-data: get-modes conn-port 'cgi

   print "^/^/Contenu=" probe decode-cgi read-cgi

   write-io conn-port to-binary("clap clap") 7

   close conn-port
]


J'ai déja testé un cgi perl "hello world" qui marchait avec nginx en passant par fcgiwrap (qui permet d'utiliser les cgi normaux avec un serveur fastcgi). Je pense donc que ma config nginx est plus ou moins bonne.
Est-ce qu'il y a une séquence spéciale à écrire sur le port fastcgi pour que nginx comprenne qu'il doive retourner "clap clap" et clore la connexion sans erreur???

Si quelqu'un a déjà utilisé Rebol avec succès pour des fastcgi je serais déjà un peu rassuré. Si en plus on pouvait me dire comment faire ça serait fantastique.

Merci pour vos réponses!
Laurent
Laurent7-Dec-2010/7:36:36+1:00
(petit problème d'indentation du au copié collé)
Didec7-Dec-2010/10:39:56+1:00
D'emblée, il va falloir attendre quelqu'un qui s'y connaisse en FastCGI : ce n'est pas mon cas (Dockimbel, hou hou !!).

Dans quel mode veux-tu utiliser FastCGI : "CGI Compatibility Mode" ou "FastCGI Stand-Alone Mode" ?

Et puis en y regardant de plus près, il semble y avoir un protocole à respecter pour l'envoi et la réception de donnée. A voir ici : http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S3.3 . Mais là, je peux m'égarer !!
Didec7-Dec-2010/10:47:59+1:00
...et puis en plus ton code est buggué !!!

la ligne 'write-io est foireuse car tu utilise une synthaxe de fonction pour to-binary qui n'a rien de Rebolienne. Si ça se trouve, ton script plante Rebol/command et donc Nginx ne reçoit pas de réponse : il n'apprécie pas !

Tu as plusieurs façon d'écrire ton résultat, sachant qu'en Rebol 2, une chaine et un binaire représente la même suite d'octets (plus le cas avec Rebol 3 et l'UTF8). Donc tu n'es pas obligé de convertir ta chaine en binaire, ou tu peux simplement la faire passer pour un binaire. Donc tu as trois choix :
; ton code sans erreur de syntaxe
write-io conn-port to-binary "clap clap" 7
; le même sans le 'copy implicite que provoque 'to-binary
write-io conn-port as-binary "clap clap" 7
; mais logiquement, cela doit marcher aussi :
write-io conn-port "clap clap" 7
Laurent7-Dec-2010/11:36:30+1:00
C'est en mode fastcgi Stand alone (boucle forever) car je veux pondre le moins de processus possible.

Si je ne me trompe pas le protocole fastcgi avec ses structures record etc est géré par Rebol (j'ai payé pour ça) et comme le dit Carl je devrais juste avoir à écrire sur conn-port.

Sauf erreur de ma part decode-cgi convertit en série rebol ce que retourne read-io qui est en binaire. C'est consistant avec le fait d’écrire aussi en binaire sur le port fast-cgi, ce que des recherches sur le net m'on confirmé (un mec a ecrit un broker fast-cgi pour rebol trafiqué, et il fait comme ça : http://www.rebol.org/view-script.r?script=fcgi-broker.r )

Et les parenthèses c'est tout à fait rebolien, même si c'est plus élégant de ne pas les utiliser ça permet de préciser sur quoi s'applique la fonction (regarde la section 6.1.1 du tuto http://www.re-bol.com/rebol.html#section-6.1 ). J'avais spontanément essayé sans parenthèses d'abord, mais même avec ça ne marche pas.
Laurent7-Dec-2010/11:38:38+1:00
Et mon rebol ne plante pas, la boucle forever tourne bien, je peux envoyer plusieurs POST et j'ai plusieurs probe qui affichent le contenu cgi.
Laurent7-Dec-2010/12:49:59+1:00
Ce soir j'essaierai avec as-binary, en tout cas merci.

{{{ Au fait comment fait-on dans RebolBB pour afficher du code comme sur une console comme tu viens de le faire? }}}
Laurent7-Dec-2010/12:55:59+1:00
Je testerai aussi en écrivant "Content-Type: text/html^/" d'abord. Si c'est ça je me tire une balle.
GreG7-Dec-2010/14:39:55+1:00
Si tu cliques sur le bouton Help en haut de cette page, un exemple devrait répondre à ta question de mise en forme.
Laurent7-Dec-2010/15:29:40+1:00
Merci Greg
Didec7-Dec-2010/17:28:18+1:00
Hum, je commence à comprendre certaines choses petit à petit.

En l'occurrence, tu ouvre un port avec le protocole 'fastcgi.
Donc c'est effectivement au protocole de se débrouiller pour le codage/décodage du protocole fastcgi. C'est donc aussi à lui d'encoer/décoder en binaire si nécessaire.

Mais tu utilise 'write-io et je me demande si cela ne chunte pas le protocole en écrivant directement sur le port ou quelquechose comme ça (j'suis pas sûre) ?
Ca ne coute rien de le remplacer par un 'write, et même plutôt un 'insert pour voir si ça passe mieux.
nve7-Dec-2010/18:23:06+1:00
Tout d'abord bienvenue sur le Forum RebelBB !
Et content de voir un petit nouveau qui s'intéresse de près à REBOL.

Pour ce qui concerne ton problème fastcgi, je ne pourrai pas t'aider...
Néanmoins, si tu ne trouves pas tes réponses sur ce forum, il y a le système AltME sur lequel tu trouveras les acteurs principaux de la communauté REBOL.
Y compris le DocKimbel...
Voici l'adresse avec les instructions :
http://www.rebol.org/aga-join.r

-]-nve-[-
Laurent8-Dec-2010/15:37:58+1:00
Eureka! En mettant "Content-Type: text/html^/" ça ne marchait pas mais en fouillant dans les exemples en C du site www.fastcgi.com j'ai vu qu'ils mettaient DEUX retours à la ligne après "Content-Type: text/html". J'ai donc modifié mon code pour écrire "Content-Type: text/html^/^/<html><h1>clap clap</h1></html>" (notez les 2 ^/ )et voilà !
C'était aussi bête que ça. De plus j'utilise l'instruction append pour écrire sur le port (qui est considéré comme une serie), c'est quand même plus propre.

REBOL[title: "test fast-cgi rebol"]
listen-port: open fastcgi://:9000

read-cgi: func [
    /local data buffer
][
    switch cgi-data/request-method [
        "POST" [
            data: make string! 1020
            buffer: make string! 16380
            while [positive? read-io conn-port buffer 16380][
                append data buffer
                clear buffer
            ]
        ]
        "GET" [data: cgi-data/query-string]
    ]
    data
]

forever [

	wait listen-port

	conn-port: first listen-port
    cgi-data: get-modes conn-port 'cgi
 
	print "^/Contenu=" probe decode-cgi read-cgi 

	append conn-port "Content-Type: text/html^/^/<html><h1>clap clap</h1></html>"

	print "^/conn-port out =" probe conn-port/state/outBuffer

	close conn-port
]


Cela me retourne sur la console:
Contenu=
[Field: "si rebol marche bien tape dans tes mains" Submit: "Submit"]

conn-port out =
{Content-Type: text/html^M
^M
<html><h1>clap clap</h1></html>}


Merci pour vos réponses en tout cas.
Laurent8-Dec-2010/15:40:48+1:00
PS : j'ai mis un "wait listen-port" au cas où, mais ça ne semble pas vraiment nécessaire.
Didec8-Dec-2010/18:35:35+1:00
Super !
Je te souhaite bonne continuation.

Tiens nous au courant de tes progrès ou problèmes !

Happy reboling
Didec9-Dec-2010/22:34:31+1:00
Hier, j'ai signalé l'erreur dans la doc par le Feedback de la page (lien "Contact" en bas) et elle a été corrigée aujourd'hui.

Ne pas hésiter à utiliser le feedback pour ce genre de chose.

Ce qui n'est pas dit ne peut être entendu !
Laurent11-Dec-2010/13:59:52+1:00
Cool, ça c'est de la réactivité
Laurent14-Dec-2010/13:29:39+1:00
Pour compléter ce thread, je tiens a signaler que pour récupérer les valeurs d'un formulaire multipart (par exemple pour faire de l'upload de fichier) la fonction "decode-cgi" standard de Rebol ne marche pas! :( Heureusement la communauté Rebol est là et on peut utiliser pour ça la fonction "decode-multipart-form-data" qui marche très bien. Elle disponible ici: http://www.rebol.org/ml-display-message.r?m=rmlKVSQ

Voila voila...
nve14-Dec-2010/15:28:17+1:00
N'hésite pas à poster le bug sur RAMBO :

http://www.rebol.net/cgi-bin/rambo.r

Il y a potentiellement une version R2 2.7.8 en préparation.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2