Protocol halfway ported
This commit is contained in:
parent
6aad821279
commit
973f2fcf98
4 changed files with 66 additions and 56 deletions
|
@ -1 +1 @@
|
|||
Subproject commit cbac148c440a93db44bad767a43c6d8619f6871f
|
||||
Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270
|
|
@ -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\
|
||||
|
|
|
@ -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
|
||||
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
|
||||
},
|
||||
gen_server:cast(ggs_server, Processed).
|
||||
end.
|
||||
|
||||
|
|
|
@ -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
|
||||
%%-----------------------------------------------------
|
||||
|
|
Reference in a new issue