diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 07af5629..94ebc690 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, macos-11.0] + os: [ubuntu-20.04, macos-10.15] rust-version: [stable, beta] steps: - name: Checkout sources diff --git a/src/lib/http/http_server.pl b/src/lib/http/http_server.pl index db96dd08..9e6d504b 100644 --- a/src/lib/http/http_server.pl +++ b/src/lib/http/http_server.pl @@ -33,12 +33,13 @@ - http_status_code(Responde, StatusCode) - http_body(Response/Request, text(Body)) - http_body(Response/Request, binary(Body)) + - http_body(Request, form(Form)) - http_body(Response, file(Filename)) - http_redirect(Response, Url) - http_query(Request, QueryName, QueryValue) Some things that are still missing: - - Read forms + - Read forms in multipart format - HTTP Basic Auth - Keep-Alive support - Session handling via cookies @@ -111,11 +112,22 @@ accept_loop(Socket, Handlers) :- ), close(Stream)), accept_loop(Socket, Handlers). +match_handler(Handlers, Method, "/", Handler) :- + member(H, Handlers), + H =.. [Method, /, Handler]. match_handler(Handlers, Method, Path, Handler) :- member(H, Handlers), copy_term(H, H1), H1 =.. [Method, Pattern, Handler], + \+ var(Pattern), phrase(path(Pattern), Path). +match_handler(Handlers, Method, Path, Handler) :- + member(H, Handlers), + copy_term(H, H1), + H1 =.. [Method, Var, Handler], + var(Var), + Var = Path. + % Helper and recommended predicates @@ -123,6 +135,10 @@ http_headers(http_request(Headers, _, _), Headers). http_headers(http_response(_, _, Headers), Headers). http_body(http_request(_, binary(ByteBody), _), text(TextBody)) :- chars_utf8bytes(TextBody, ByteBody). +http_body(http_request(Headers, binary(ByteBody), _), form(FormBody)) :- + member("content-type"-"application/x-www-form-urlencoded", Headers), + chars_utf8bytes(TextBody, ByteBody), + phrase(parse_queries(FormBody), TextBody). http_body(http_request(_, Body, _), Body). http_body(http_response(_, Body, _), Body).