n2o_document.erl 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. -module(n2o_document).
  2. -description('N2O Server Pages HTTP endpoint handler').
  3. -author('Maxim Sokhatsky').
  4. -include_lib("n2o/include/wf.hrl").
  5. -compile (export_all).
  6. transition(Actions) ->
  7. receive
  8. {'INIT',A} -> transition(A);
  9. {'N2O',Pid} -> Pid ! {actions,Actions}
  10. after wf:config(n2o,transition_timeout,30000) -> {timeout,transition}
  11. end.
  12. run(Req) ->
  13. wf:state(status,200),
  14. Pid = spawn(fun() -> transition([]) end),
  15. wf:script(["var transition = {pid: '", wf:pickle(Pid), "', ",
  16. "port:'", wf:to_list(wf:config(n2o,websocket_port,wf:config(n2o,port,8000))),"'}"]),
  17. Ctx = wf:init_context(Req),
  18. Ctx1 = wf:fold(init,Ctx#cx.handlers,Ctx),
  19. wf:actions(Ctx1#cx.actions),
  20. wf:context(Ctx1),
  21. Elements = try (Ctx1#cx.module):main() catch C:E -> wf:error_page(C,E) end,
  22. Html = wf_render:render(Elements),
  23. Actions = wf:actions(),
  24. Pid ! {'INIT',Actions},
  25. Ctx2 = wf:fold(finish,Ctx#cx.handlers,?CTX),
  26. Req2 = wf:response(Html,set_cookies(wf:cookies(),Ctx2#cx.req)),
  27. wf:info(?MODULE,"Cookies Req: ~p",[Req2]),
  28. {ok, _ReqFinal} = wf:reply(wf:state(status), Req2).
  29. set_cookies([],Req)-> Req;
  30. set_cookies([{Name,Value,Path,TTL}|Cookies],Req)->
  31. set_cookies(Cookies,wf:cookie_req(Name,Value,Path,TTL,Req)).