http_body/2,
http_redirect/2,
http_query/3,
- urldecode//1
+ url_decode//1
]).
:- use_module(library(sockets)).
:- use_module(library(time)).
:- use_module(library(crypto)).
-% TODO
-% - HTTP Error Codes
-% - Improve code quality
-% - Comments
-% - Remove !
-% - URL Encode
-
% Server initialization
http_listen(Port, Handlers) :-
must_be(integer, Port),
% Server loop
accept_loop(Socket, Handlers) :-
- setup_call_cleanup(socket_server_accept(Socket, Client, Stream, [type(binary)]),
+ setup_call_cleanup(socket_server_accept(Socket, _Client, Stream, [type(binary)]),
(
read_header_lines(Stream, Lines),
[Request|Headers] = Lines,
(
- (phrase(parse_request(Version, Method, Path, Queries), Request), maplist(map_parse_header, Headers, HeadersKV)) -> (
+ (phrase(parse_request(_Version, Method, Path, Queries), Request), maplist(map_parse_header, Headers, HeadersKV)) -> (
(
member("content-length"-ContentLength, HeadersKV) ->
(number_chars(ContentLengthN, ContentLength), get_bytes(Stream, ContentLengthN, Body))
parse_queries([Key-Value|Queries]) -->
string_without("=", Key0),
{
- phrase(urldecode(Key), Key0)
+ phrase(url_decode(Key), Key0)
},
"=",
string_without("&", Value0),
{
- phrase(urldecode(Value), Value0)
+ phrase(url_decode(Value), Value0)
},
"&",
parse_queries(Queries).
parse_queries([Key-Value]) -->
string_without("=", Key0),
{
- phrase(urldecode(Key), Key0)
+ phrase(url_decode(Key), Key0)
},
"=",
string_without(" ", Value0),
{
- phrase(urldecode(Value), Value0)
+ phrase(url_decode(Value), Value0)
}.
map_parse_header(Header, HeaderKV) :-
; Char = Lower).
% Decodes a UTF-8 URL Encoded string: RFC-1738
-urldecode([Char|Chars]) -->
+url_decode([Char|Chars]) -->
[Char],
{
Char \= '%'
},
- urldecode(Chars).
-urldecode([Char|Chars]) -->
+ url_decode(Chars).
+url_decode([Char|Chars]) -->
"%",
[A],
[B],
chars_utf8bytes(Chars0, Bytes),
Chars0 = [Char]
},
- urldecode(Chars).
-urldecode([Char|Chars]) -->
+ url_decode(Chars).
+url_decode([Char|Chars]) -->
"%",
[A, B],
"%",
chars_utf8bytes(Chars0, Bytes),
Chars0 = [Char]
},
- urldecode(Chars).
-urldecode([Char|Chars]) -->
+ url_decode(Chars).
+url_decode([Char|Chars]) -->
"%",
[A, B],
"%",
chars_utf8bytes(Chars0, Bytes),
Chars0 = [Char]
},
- urldecode(Chars).
-urldecode([Char|Chars]) -->
+ url_decode(Chars).
+url_decode([Char|Chars]) -->
"%",
[A, B],
"%",
chars_utf8bytes(Chars0, Bytes),
Chars0 = [Char]
},
- urldecode(Chars).
+ url_decode(Chars).
-urldecode([]) --> [].
+url_decode([]) --> [].