2010-11-27 4 views
3

J'essaie de faire fonctionner les Inets de Erlang mode_esi et d'exécuter certaines fonctions. Donc, loin, je n'ai pas réussi. Quelqu'un peut-il publier un exemple minimal de la façon d'exécuter Inets afin qu'une URL comme http:localhost:8099/esi/my_mod:foo appelle la méthode my_mod:foo/3?Exemple de travail pour l'interface du serveur Erlang

Addition: J'ai commencé INET avec ces commandes:

inets:start(), 
inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."}, 
    {server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]). 

Le module est:

-module(my_esi). 
-export([foo/3]). 
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["bla"]). 

Mais la navigation à http://localhost:8099/esi/my_esi:foo résultat dans un message d'erreur.

Répondre

1

Je l'ai résolu moi-même. Pour une raison quelconque, au-delà de ma compréhension, le même code a fonctionné lorsque j'ai invoqué Inets avec un fichier de configuration (une version modifiée de inets/examples/server_root/conf/8080.conf). Je suppose que le fichier d'exemple inclut une liste plus complète de propriétés que Inets requis que ce que j'ai énuméré dans inets:start(httpd, [...]). Si quelqu'un rencontre le problème Inets dans le futur, mon conseil est de commencer par la configuration d'exemple.

0

Ok, va ici:

  1. mis {erl_script_alias, {"/esi", [my_mod]}} pour le serveur Web inets, de sorte que le module est accepté.
  2. Écrivez my_mod. Quelque chose comme:

    -module(my_mod). 
    -export([foo/3]). 
    
    
    foo(SessID, _Env, _Input) -> 
        mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]). 
    
  3. Assurez-vous mod_esi fait partie de inets section module appelé: {modules, [.., mod_esi, ..}}
  4. Cette étape est très importante: Respirez 3 fois, réciter les paroles saintes « Je prie pour toi, INET, que vous allez travailler cette fois ". Croiser les doigts.
  5. Boire une tasse de café. Le thé ne le fera pas. Ça doit être du café.
  6. Profitez de votre serveur web.
+0

Je mis à jour la question avec l'exemple sans travail. Qu'est-ce que je fais mal là-bas? On dirait une version simple de ce que vous avez écrit. –

1

Pour clarifier ce qui a déjà été dit, je vais donner un exemple de travail (à partir de zéro). Ceci est d'aider ceux qui sont venus ici de Google, surtout parce qu'il est la façon dont je l'ai trouvé;)

d'abord, créez le module:

# filename: my_esi.erl 
-module(my_esi). 
-export([foo/3,bar/3]). 
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["foo"]). 
bar(Sid, Env, In) -> mod_esi:deliver(Sid, ["bar"]). 

Enregistrer, puis compiler:

erlc my_esi.erl 

Vous avez maintenant my_esi.beam

Ensuite, exécutez le shell bash de

erl 

Dans le shell tapez ce qui suit:

inets:start(). 
{Httpd_State,Httpd_Pid} = inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."}, {modules,[mod_esi]},{server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]). 

L'important ici est:

{modules,[mod_esi]} 

Si vous avez besoin d'autres modules, charge en les ajoutant à la liste.

Pour préciser comment/pourquoi:

Je vais d'abord admettre que ce ne semble un peu étrange au début, et que la documentation était moins utile que je ne l'avais espéré. Cependant, je me suis aperçu que:

modules()  -> [atom()] 

devient:

{modules, [mod_access, mod_esi, ..., etc.]} 

aide quelqu'un espère que cela :)

Questions connexes