diff --git a/erlang_js b/erlang_js index cbac148..5350ed2 160000 --- a/erlang_js +++ b/erlang_js @@ -1 +1 @@ -Subproject commit cbac148c440a93db44bad767a43c6d8619f6871f +Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270 diff --git a/python_client b/python_client index 4dd82ae..e707115 100755 --- a/python_client +++ b/python_client @@ -11,7 +11,7 @@ s.connect((HOST, PORT)) print "Saying hello to server" s.send( -"Command: hello\n\ +"Server-Command: hello\n\ Content-Type: text\n\ Content-Length: 0\n\ \n\ @@ -27,7 +27,7 @@ print "Data: ", ' '.join(data.split(" ")[1:]) print "Defining a function called myFun" s.send( "Token: %s\n\ -Command: define\n\ +Server-Command: define\n\ Content-Type: text\n\ Content-Length: 42\n\ \n\ @@ -42,7 +42,7 @@ print "Data: ", ' '.join(data.split(" ")[1:]) print "Calling myFun" s.send( "Token: %s\n\ -Command: call\n\ +Server-Command: call\n\ Content-Type: text\n\ Content-Length: 6\n\ \n\ @@ -63,7 +63,7 @@ s.connect((HOST, PORT)) print "Calling myFun" s.send( "Token: %s\n\ -Command: call\n\ +Server-Command: call\n\ Content-Type: text\n\ Content-Length: 6\n\ \n\ diff --git a/src/ggs_protocol.erl b/src/ggs_protocol.erl index ede5115..46c1ba1 100644 --- a/src/ggs_protocol.erl +++ b/src/ggs_protocol.erl @@ -2,38 +2,48 @@ -export([parse/1]). parse(Data) -> - Message =string:tokens(Data, "\n"), - % Turn "A: B" pairs into "{A, B}" tuples, for searching. - MsgKV = lists:map((fun(Str) -> - list_to_tuple(string:tokens(Str, ": ")) end - ), Message), - % Hacky way to build a tuple, filter out not_found later on - Processed = { - case lists:keysearch("Command", 1, MsgKV) of - {value,{_, "define"}} -> - define; - {value,{_, "call"}} -> - call; - {value,{_, "hello"}} -> - hello; - false -> - not_found - end, - case lists:keysearch("Token", 1, MsgKV) of - {value,{_, Value}} -> - Value; - false -> - not_found - end, - case lists:keysearch("Content-Length", 1, MsgKV) of - {value,{_, Value}} -> - {Length, _} = string:to_integer(Value), - [_|Cont] = re:split(Data, "\n\n",[{return,list}]), - Content = string:join(Cont, "\n\n"), - Payload = string:substr(Content,1,Length), - Payload; - false -> - not_found - end - }, - gen_server:cast(ggs_server, Processed). + Parsed = do_parse(Data, []), + prettify(Parsed). + +do_parse(Data, ParsedMessage) -> + NewLinePos = string:chr(Data, $\n), + Line = string:substr(Data, 1, NewLinePos-1), + Tokens = re:split(Line, ": ", [{return, list}]), + case handle(Tokens) of + {Command, more} -> + do_parse(string:substr(Data, NewLinePos+1), ParsedMessage ++ [Command]); + {separator, data_next} -> + {_, Value} = lists:keyfind(content_len, 1, ParsedMessage), + {ContentLength, []} = string:to_integer(Value), + {ParsedMessage, handle_data(string:substr(Data, NewLinePos+1), ContentLength)} + end. + +handle([[]]) -> + {separator, data_next}; +handle(["Server-Command", Param]) -> + {{srv_cmd, Param}, more}; +handle(["Content-Length", Param]) -> + {{content_len, Param}, more}; +handle(["Token", Param]) -> + {{token, Param}, more}; +handle(["Content-Type", Param]) -> + {{content_type, Param}, more}. + +handle_data(Data, Length) -> + {data, string:substr(Data,1,Length)}. + + +%% Helpers +prettify({Args, Data}) -> + case lists:keyfind(srv_cmd, 1, Args) of + {_, Value} -> + gen_server:cast(ggs_server, {srv_cmd, Value, Args, Data}); + _Other -> + case lists:keyfind(game_cmd, 1, Args) of + {_, Value} -> + gen_server:cast(ggs_server, {game_cmd, Value, Args, Data}); + _ -> + ok + end + end. + diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 68b1625..4a116fa 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -95,30 +95,30 @@ handle_cast(stop, State) -> {stop, normal, State}; % Handle javascript defines -handle_cast({define, Token, Payload}, State) -> - JSVM = getJSVM(Token, State), - js_runner:define(JSVM, Payload), - send(State#state.lsock, Token, "Okay, defined that for you!"), +handle_cast({srv_cmd, "define", Args, Data}, State) -> + %JSVM = getJSVM(Token, State), + %js_runner:define(JSVM, Payload), + send(State#state.lsock, "Token", "Okay, defined that for you!"), {noreply, State}; % Handle javascript calls -handle_cast({call, Token, Payload}, State) -> - io:format("Got call request: ~p~n", [Payload]), - JSVM = getJSVM(Token, State), - erlang:display(erlang:port_info(JSVM)), - {ok, Ret} = js_runner:call(JSVM, Payload, []),%Payload, []), - send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), +handle_cast({srv_cmd, "call", Args, Data}, State) -> + %io:format("Got call request: ~p~n", [Payload]), + %JSVM = getJSVM(Token, State), + %erlang:display(erlang:port_info(JSVM)), + %{ok, Ret} = js_runner:call(JSVM, Payload, []),%Payload, []), + %send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), {noreply, State}; % Set the new state to the reference generated, and JSVM associated -handle_cast({hello, _, _}, State) -> - JSVM = js_runner:boot(), +handle_cast({srv_cmd, "hello", Headers, Data}, State) -> + %JSVM = js_runner:boot(), Client = getRef(), send(State#state.lsock, Client, "This is your refID"), - OldMap = State#state.client_vm_map, - NewState = State#state{client_vm_map = OldMap ++ [{Client, JSVM}]}, - gen_server:cast(ggs_backup, {set_backup, NewState}), - {noreply, NewState}. + %OldMap = State#state.client_vm_map, + %NewState = State#state{client_vm_map = OldMap ++ [{Client, JSVM}]}, + %gen_server:cast(ggs_backup, {set_backup, NewState}), + {noreply, State}. %NewState %%----------------------------------------------------- %% Helpers %%-----------------------------------------------------