+ )
+ ; Term =.. [cgi, Path, Script] ->
+ maplist(chars_si, [Path, Script]),
+ maplist(is_path, [Path, Script])
+ ; Term =.. [redirect, From, To, Opts] ->
+ maplist(chars_si, [From, To]),
+ maplist(is_path, [From, To]),
+ list_si(Opts),
+ maplist(atom_si, Opts),
+ maplist(mode_or_keep_query, Opts),
+ \+ permutation(Opts, [permanent, temporary]),
+ length(Opts, L),
+ L #< 3.
+
+%% Helpers
+mode_to_response(Mode, Mode1) :-
+ atom_chars(Mode, ModeS),
+ append(ModeS, "_redirection", ModeS1),
+ atom_chars(Mode1, ModeS1).
+
+parse_addr_port(Chars, Addr, Port) :-
+ append(AddrChars, [':'|PortChars], Chars),
+ !,
+ atom_chars(Addr, AddrChars),
+ number_chars(Port, PortChars).
+
+mode_or_keep_query(permanent).
+mode_or_keep_query(temporary).
+mode_or_keep_query(keep_query).
+
+is_path(P) :-
+ P = ['/'|Ps],
+ maplist(char_or_slash, Ps).
+
+char_or_slash(C) :-
+ char_type(C, alpha).
+char_or_slash('/').
+char_or_slash('-').
+char_or_slash('.').