]> Repositorios git - scryer-prolog.git/commitdiff
Some minor fixes. Thanks to @triska for them!
authorAdrián Arroyo Calle <[email protected]>
Sun, 9 Oct 2022 16:09:52 +0000 (18:09 +0200)
committerMark Thom <[email protected]>
Thu, 27 Oct 2022 05:36:07 +0000 (23:36 -0600)
README.md
src/lib/http/http_server.pl

index f9df1779c87e7f740c76414b57e62a81f619556e..a6b2fbad5797db51cb17cb8bf7b171bf80d7bb66 100644 (file)
--- a/README.md
+++ b/README.md
@@ -539,7 +539,7 @@ The modules that ship with Scryer&nbsp;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&nbsp;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&nbsp;documents
   as Prolog&nbsp;terms for convenient and efficient reasoning. Use
index a49969eee25e2582e2a1ddc7f2fb28f4a94d2234..0f467fd42c47943ee13c07943abd00626f9e1c7b 100644 (file)
@@ -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) :-