[erlang-questions] Exchanging messages during functions called by Erlang Server Interface mod_esi?

Ingo Jaeckel ingo.jaeckel@REDACTED
Thu Jan 12 17:08:00 CET 2012


Hello,

I am currently developing a module that creates an instance of inets
http server. After starting the server, I call two different messages
of my module (create/3, read/3) from a browser. Both methods are shown
below:

create(SessionID, Env, _Input) ->
       {Key, Value} = lists:last(Env),

       case Key of
               query_string ->
                       reply(SessionID, "{created: true}"),
                       storage ! {create, string_to_tuple(Value)};
               _ ->
                       reply(SessionID, "{error: \"Missing query string.\"}")
       end.

read(SessionID, _Env, _Input) ->
       storage ! {read, self()},
       receive
              [] ->   reply(SessionID, lists:concat(["{\"results\": []}"]));
              Data ->
                      reply(SessionID, lists:concat(["{\"count\": ",
length(Data), ", \"results\": ", json:encode(Data), "}"]))
      end.

reply(SessionID, Reply) ->
       mod_esi:deliver(SessionID, [
               "Content-Type: application/json\r\n\r\n",
               Reply
       ]).

I can open the URL for the create/3 function without any problems. The
browser immediately receives the proper reply. But when I try to call
the URL for read/3, the server never receives a response. I have
exactly the same behavior for create/3 when I send a message BEFORE
replying back to the client.

Now, one difference between read/3 and create/3 is that read/3 sends
and receives a message to a registered process (running on the same
node) before it replies back to the client. Is this maybe something
you cannot do within functions called by mod_esi? Or could there be
another reason preventing me from sending a proper reply back to the
client?

Thank you very much in advance!

Regards,
Ingo



More information about the erlang-questions mailing list