[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