-compile(export_all). -define(TEMPLATEURL, "http://pepper.sherry.jp:8012/chat_temp.html"). out(Arg) -> % Session処理 C = (Arg#arg.headers)#headers.cookie, {SessionCookie, SetCookie} = case yaws_api:find_cookie_val("chat", C) of [] -> Cookie = yaws_api:new_cookie_session({}), CO = yaws_api:setcookie("chat",Cookie,"/"), {Cookie, CO}; Cookie -> case yaws_api:cookieval_to_opaque(Cookie) of {ok, OP} -> Cookie, {Cookie, undefined}; {error, no_session} -> CO = yaws_api:setcookie("chat",Cookie,"/", [], "pepper.sherry.jp"), {Cookie, CO} end end, put(session, SessionCookie), % リクエスト処理 Method = (Arg#arg.req)#http_request.method, ReturnMessage = case Method of 'GET' -> req_get(Arg, SessionCookie); 'POST' -> req_post(Arg) end, case SetCookie of undefined -> ReturnMessage; Else -> [SetCookie, ReturnMessage] end. req_get(Arg, SessionCookie) -> Form = yaws_api:parse_query(Arg), case lists:keysearch("id", 1, Form) of {value, {"id", Id}} -> chatserver ! {getmessage, get(session), self(), list_to_integer(Id)}, ReturnMessage = receive {ok, SessionCookie, Data} -> convjson(Data) after 30 * 1000 -> chatserver ! {cancelmessage, self()}, % 時間がたったのでいったん空の応答を返す "jsonpcb([])" end, {html, ReturnMessage}; Else -> {ok, {_Status, _Headers, Body}} = http:request(?TEMPLATEURL), {html, Body} end. convjson(Data) -> {Members, Log} = Data, JsonMembers = {array, lists:map( fun(E) -> {Name} = E, {struct, [ {"name", Name} ]} end, Members)}, JsonLog = {array, lists:map( fun(E) -> {MesId, {Time, Name, Message}} = E, {struct, [ {"id", MesId}, {"time", Time}, {"name", Name}, {"message", Message} ]} end, Log)}, "jsonpcb(" ++ json:encode({array, [JsonMembers, JsonLog]}) ++ ")". req_post(Arg) -> SessionCookie = get(session), Form = yaws_api:parse_post(Arg), Ret1 = case Name = httpd_util:key1search(Form, "name") of undefined -> true, ""; Name -> chatserver ! {join, SessionCookie, Name}, "ok" end, Ret2 = case Logout = httpd_util:key1search(Form, "logout") of undefined -> true, ""; Logout -> chatserver ! {part, SessionCookie}, "ok" end, Ret3 = case Message = httpd_util:key1search(Form, "message") of undefined -> true, ""; Message -> chatserver ! {postmessage, SessionCookie, self(), Message}, receive Status -> Status end end, {html, Ret1 ++ Ret2 ++ Ret3}.