WHY WONT IT PARSE THE LAST FUCKING BYTE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH
This commit is contained in:
+58
-19
@@ -28,6 +28,7 @@
|
||||
%%% Type and Record Definitions
|
||||
|
||||
-include("http.hrl").
|
||||
-include("$zx_include/zx_logger.hrl").
|
||||
|
||||
|
||||
-record(s, {socket = none :: none | gen_tcp:socket(),
|
||||
@@ -131,19 +132,24 @@ loop(Parent, Debug, State = #s{socket = Socket, next = Next}) ->
|
||||
ok = inet:setopts(Socket, [{active, once}]),
|
||||
receive
|
||||
{tcp, Socket, Message} ->
|
||||
%ok = io:format("~p received: ~tp~n", [self(), Message]),
|
||||
tell("~p Next = ~p", [?LINE, Next]),
|
||||
Received =
|
||||
case Next of
|
||||
none -> Message;
|
||||
_ -> <<Next/binary, Message/binary>>
|
||||
end,
|
||||
tell("qhl_parse(Socket, ~tp)", [Received]),
|
||||
case qhl:parse(Socket, Received) of
|
||||
{ok, Req, NewNext} ->
|
||||
tell("qhl return: {ok, ~p, ~p}", [Req, NewNext]),
|
||||
handle_request(Socket, Req),
|
||||
NewState = State#s{next = NewNext},
|
||||
loop(Parent, Debug, NewState);
|
||||
Error ->
|
||||
io:format("~tp:~tp error: ~tp~n", [self(), ?LINE, Error]),
|
||||
%% should trigger bad request
|
||||
io:format("~p QHL parse error: ~tp", [?LINE, Error]),
|
||||
io:format("~p bad request:~n~ts", [?LINE, Received]),
|
||||
http_err(Socket, 400),
|
||||
gen_tcp:shutdown(Socket, read_write),
|
||||
exit(normal)
|
||||
end;
|
||||
@@ -155,18 +161,6 @@ loop(Parent, Debug, State = #s{socket = Socket, next = Next}) ->
|
||||
Unexpected ->
|
||||
ok = io:format("~p Unexpected message: ~tp", [self(), Unexpected]),
|
||||
loop(Parent, Debug, State)
|
||||
%{tcp, Socket, <<"bye\r\n">>} ->
|
||||
% ok = io:format("~p Client saying goodbye. Bye!~n", [self()]),
|
||||
% ok = gen_tcp:send(Socket, "Bye!\r\n"),
|
||||
% ok = gen_tcp:shutdown(Socket, read_write),
|
||||
% exit(normal);
|
||||
%{relay, Sender, Message} when Sender == self() ->
|
||||
% ok = gen_tcp:send(Socket, ["Message from YOU: ", Message]),
|
||||
% loop(Parent, Debug, State);
|
||||
%{relay, Sender, Message} ->
|
||||
% From = io_lib:format("Message from ~tp: ", [Sender]),
|
||||
% ok = gen_tcp:send(Socket, [From, Message]),
|
||||
% loop(Parent, Debug, State);
|
||||
end.
|
||||
|
||||
|
||||
@@ -224,12 +218,23 @@ system_replace_state(StateFun, State) ->
|
||||
%%% http request handling
|
||||
|
||||
handle_request(Sock, R = #request{method = M, path = P}) when M =/= undefined, P =/= undefined ->
|
||||
zx:tell("~p ~p ~ts", [self(), M, P]),
|
||||
tell("~p ~ts", [M, P]),
|
||||
route(Sock, M, P, R).
|
||||
|
||||
|
||||
route(Sock, get, <<"/">>, _) -> home(Sock);
|
||||
route(Sock, _, _, _) -> http_err(Sock, 404).
|
||||
route(Sock, get, Route, _Request) ->
|
||||
case Route of
|
||||
<<"/">> -> home(Sock);
|
||||
<<"/default.css">> -> default_css(Sock);
|
||||
_ -> http_err(Sock, 404)
|
||||
end;
|
||||
route(Sock, post, Route, Request) ->
|
||||
case Route of
|
||||
<<"/wfcin">> -> wfcin(Sock, Request);
|
||||
_ -> http_err(Sock, 404)
|
||||
end;
|
||||
route(Sock, _, _, _) ->
|
||||
http_err(Sock, 404).
|
||||
|
||||
|
||||
home(Sock) ->
|
||||
@@ -240,13 +245,47 @@ home(Sock) ->
|
||||
Resp = #response{headers = [{"content-type", "text/html"}],
|
||||
body = Body},
|
||||
respond(Sock, Resp);
|
||||
Error ->
|
||||
tell("error: ~p~n", [self(), Error]),
|
||||
http_err(Sock, 500)
|
||||
end.
|
||||
|
||||
default_css(Sock) ->
|
||||
%% fixme: cache
|
||||
Path_IH = filename:join([zx:get_home(), "priv", "default.css"]),
|
||||
case file:read_file(Path_IH) of
|
||||
{ok, Body} ->
|
||||
Resp = #response{headers = [{"content-type", "text/css"}],
|
||||
body = Body},
|
||||
respond(Sock, Resp);
|
||||
Error ->
|
||||
io:format("~p error: ~p~n", [self(), Error]),
|
||||
http_err(Sock, 500)
|
||||
end.
|
||||
|
||||
http_err(_, _) ->
|
||||
error(todo).
|
||||
wfcin(Sock, Request) ->
|
||||
tell("wfcin request: ~tp", [Request]),
|
||||
http_err(Sock, 501).
|
||||
|
||||
%% FIXME
|
||||
http_err(Sock, N) ->
|
||||
Slogan = qhl:slogan(N),
|
||||
Body = ["<!doctype html>"
|
||||
"<html lang=\"en\">"
|
||||
"<head>"
|
||||
"<meta charset=\"utf-8\">"
|
||||
"<title>QHL: ", integer_to_list(N), " ", Slogan, "</title>"
|
||||
"</head>"
|
||||
"<body>"
|
||||
"<h1>"
|
||||
"QHL: ", integer_to_list(N), " ", Slogan,
|
||||
"</h1>"
|
||||
"</body>"
|
||||
"</html>"],
|
||||
Resp = #response{code = N,
|
||||
headers = [{"content/type", "text/html"}],
|
||||
body = Body},
|
||||
respond(Sock, Resp).
|
||||
|
||||
|
||||
respond(Sock, Response) ->
|
||||
|
||||
Reference in New Issue
Block a user