[erlang-questions] a question on misultin
Roberto Ostinelli
roberto@REDACTED
Tue Aug 17 12:04:28 CEST 2010
hello goblin,
for every request a process is spawned to manage its response [aka the
response controlling process], and it's this process that calls the
handle function, which MUST return a response. this is a precise
server design, since every single request/response entity has a
precise lifetime which needs to be controlled server-wise, and this
lifetime corresponds to the lifetime of the controlling process.
if for whatever reason you need to build a response from an external
process, you may do so by 'locking' the response controlling process
and sending to it the response so that it can return it. a working
example follows.
-module(misultin_hello_world).
-export([start/1, stop/0]).
-export([external_proc/1]).
% start misultin http server
start(Port) ->
misultin:start_link([{port, Port}, {loop, fun(Req) -> handle_http(Req) end}]).
% stop misultin
stop() ->
misultin:stop().
% callback on request received
handle_http(Req) ->
% spawn external process
Pid = spawn(?MODULE, external_proc, [self()]),
% send req
Pid ! Req,
% wait
receive
Response -> Response
end.
external_proc(ControllerPid) ->
receive
Req ->
% build response
Response = Req:ok("Hello World."),
% send it to controller
ControllerPid ! Response
end.
cheers,
r.
2010/8/17 gnoblin <gnoblin@REDACTED>:
> Hello,
>
> I've decided to use misultin as a webserver for my client-server
> application, and I am trying to do the following:
>
> Case 1:
>
> % process1
> handle_http(Req) ->
> % get params
> Args = Req:parse_qs(),
>
> case proplists:get_value("value", Args) of
> %% we got an empty request?
> undefined ->
> ok;
>
> Input ->
> io:format("got a request~p~n",
> [Input]),
> Req:ok([?CONTENT_TYPE], "<html>"++"Ok"++"</html>")
>
> Result: I see the response in my browser.
>
> Case 2:
> If instead of Req:ok([?CONTENT_TYPE], "<html>"++"Ok"++"</html>") I
> send a message to process2, which processes the request and sends the
> response via a message to process1,
>
> and it is received in process1 here:
>
> loop() ->
> receive
> {respond, Req, Json} ->
> io:format("Responding back! ~n"),
> %% falls somewhere here
> %% it seems i can't do it like this...
> Req:ok([?CONTENT_TYPE], "<html>"++Json++"</html>"),
> loop();
> Other ->
> io:format("says: I've got some strange message here: ~p~n",
> [Other])
> end.
>
> Result: I don't see the response.
>
> ---
> The question is: if I can't do it like that - what is the correct way
> to do it? I'd like to get a string via http from client, send it to
> other processes, get the response back to process with misultin and
> send it back to the user.
>
> Thanks
More information about the erlang-questions
mailing list