WHY WONT IT PARSE THE LAST FUCKING BYTE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH

This commit is contained in:
Peter Harpending
2025-10-10 23:21:49 -06:00
parent 69a89cf78e
commit fa16da8178
9 changed files with 1039 additions and 54 deletions
+58 -19
View File
@@ -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) ->