From f2940ddfcf353c5ce2e13a1f5d3cbeaaf68b11e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Adri=C3=A1n=20Arroyo=20Calle?= Date: Sun, 9 Oct 2022 18:09:52 +0200 Subject: [PATCH] Some minor fixes. Thanks to @triska for them! --- README.md | 2 +- src/lib/http/http_server.pl | 41 ++++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index f9df1779..a6b2fbad 100644 --- a/README.md +++ b/README.md @@ -539,7 +539,7 @@ The modules that ship with Scryer Prolog are also called Probabilistic predicates and random number generators. * [`http/http_open`](src/lib/http/http_open.pl) Open a stream to read answers from web servers. HTTPS is also supported. -* [`http/http_server`](src/lib/http/http_server.pl) Runs a HTTP/1.0 web server. +* [`http/http_server`](src/lib/http/http_server.pl) Runs a HTTP/1.1 and HTTP/2.0 web server. Uses [Hyper](https://hyper.rs) as a backend. Supports some query and form handling. * [`sgml`](src/lib/sgml.pl) `load_html/3` and `load_xml/3` represent HTML and XML documents as Prolog terms for convenient and efficient reasoning. Use diff --git a/src/lib/http/http_server.pl b/src/lib/http/http_server.pl index a49969ee..0f467fd4 100644 --- a/src/lib/http/http_server.pl +++ b/src/lib/http/http_server.pl @@ -79,8 +79,7 @@ module_qualification(M, H0, H) :- H =.. [Method, Path, M:Goal]. http_listen_(Port, Handlers) :- - number_chars(Port, CPort), - append("0.0.0.0:", CPort, Addr), + phrase(format_("0.0.0.0:~d", [Port]), Addr), '$http_listen'(Addr, HttpListener),!, format("Listening at ~s\n", [Addr]), http_loop(HttpListener, Handlers). @@ -99,10 +98,14 @@ http_loop(HttpListener, Handlers) :- HttpResponse = http_response(_, _, _), (call(Handler, HttpRequest, HttpResponse) -> send_response(ResponseHandle, HttpResponse) - ; '$http_answer'(ResponseHandle, 500, [], "Internal Server Error") + ; ( + '$http_answer'(ResponseHandle, 500, [], ResponseStream), + call_cleanup(format(ResponseStream, "Internal Server Error", []), close(ResponseStream))) ) ) - ; '$http_answer'(ResponseHandle, 404, [], "Not Found") + ; ( + '$http_answer'(ResponseHandle, 404, [], ResponseStream), + call_cleanup(format(ResponseStream, "Not Found"), close(ResponseStream))) ), http_loop(HttpListener, Handlers). @@ -110,29 +113,35 @@ send_response(ResponseHandle, http_response(StatusCode0, text(ResponseText), Res default(StatusCode0, 200, StatusCode), maplist(map_header_kv_2, ResponseHeaders, ResponseHeaders0), '$http_answer'(ResponseHandle, StatusCode, ResponseHeaders, ResponseStream), - format(ResponseStream, "~s", [ResponseText]), - close(ResponseStream). + call_cleanup( + format(ResponseStream, "~s", [ResponseText]), + close(ResponseStream) + ). send_response(ResponseHandle, http_response(StatusCode0, bytes(ResponseBytes), ResponseHeaders0)) :- default(StatusCode0, 200, StatusCode), maplist(map_header_kv_2, ResponseHeaders, ResponseHeaders0), '$http_answer'(ResponseHandle, StatusCode, ResponseHeaders, ResponseStream), - format(ResponseStream, "~s", [ResponseBytes]), - close(ResponseStream). + call_cleanup( + format(ResponseStream, "~s", [ResponseBytes]), + close(ResponseStream) + ). send_response(ResponseHandle, http_response(StatusCode0, file(Filename), ResponseHeaders0)) :- default(StatusCode0, 200, StatusCode), maplist(map_header_kv_2, ResponseHeaders, ResponseHeaders0), '$http_answer'(ResponseHandle, StatusCode, ResponseHeaders, ResponseStream), - setup_call_cleanup( - open(Filename, read, FileStream, [type(binary)]), - ( - get_n_chars(FileStream, _, FileCs), - format(ResponseStream, "~s", [FileCs]) + call_cleanup( + setup_call_cleanup( + open(Filename, read, FileStream, [type(binary)]), + ( + get_n_chars(FileStream, _, FileCs), + format(ResponseStream, "~s", [FileCs]) + ), + close(FileStream) ), - close(FileStream) - ), - close(ResponseStream). + close(ResponseStream) + ). default(Var, Default, Out) :- -- 2.54.0