213 lines
5.5 KiB
Prolog
213 lines
5.5 KiB
Prolog
/* $Id$
|
|
|
|
Part of SWI-Prolog
|
|
|
|
Author: Jan Wielemaker
|
|
E-mail: jan@swi.psy.uva.nl
|
|
WWW: http://www.swi-prolog.org
|
|
Copyright (C): 1985-2002, University of Amsterdam
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
As a special exception, if you link this library with other files,
|
|
compiled with a Free Software compiler, to produce an executable, this
|
|
library does not by itself cause the resulting executable to be covered
|
|
by the GNU General Public License. This exception does not however
|
|
invalidate any other reasons why the executable file might be covered by
|
|
the GNU General Public License.
|
|
*/
|
|
|
|
:- module(demo_body,
|
|
[ reply/1
|
|
]).
|
|
:- use_module(library('http/http_client')).
|
|
:- use_module(library('http/http_mime_plugin')). % Decode multipart data
|
|
:- use_module(library('http/http_image')). % make XPCE generate images
|
|
|
|
|
|
:- style_check(-atom). % allow long atoms
|
|
|
|
reply(_) :-
|
|
flag(request, N, N+1),
|
|
fail.
|
|
|
|
% /quit
|
|
%
|
|
% Explicitely close the connection
|
|
|
|
reply(Request) :-
|
|
member(path('/quit'), Request), !,
|
|
format('Connection: close~n', []),
|
|
format('Content-type: text/html~n~n', []),
|
|
format('Bye Bye~n').
|
|
|
|
% /xpce?class=box
|
|
%
|
|
% Make XPCE reply with a graphics image. The demo-body pce_reply/1
|
|
% is called embedded in a message to XPCE to force the XPCE
|
|
% incremental garbage collector to reclaim objects created while
|
|
% serving the request. pce_reply/1 replies to ?class=box using a
|
|
% blue box with rounded corners.
|
|
|
|
reply(Request) :-
|
|
member(path('/xpce'), Request), !,
|
|
send(@prolog, call, demo_body:pce_reply(Request)).
|
|
|
|
% /env
|
|
%
|
|
% Reply with the output of printenv (Unix systems only).
|
|
|
|
reply(Request) :-
|
|
member(path('/env'), Request), !,
|
|
expand_file_name(~, Home),
|
|
format('Content-type: text/html~n~n', []),
|
|
format('<html>~n', []),
|
|
flag(request, RN, RN),
|
|
format('Request ~d~n', [RN]),
|
|
format('<pre>~n', []),
|
|
format('HOME = ~w~n~n', [Home]),
|
|
open(pipe(printenv), read, Fd),
|
|
copy_stream_data(Fd, current_output),
|
|
close(Fd),
|
|
format('</pre>~n', []),
|
|
format('</html>~n', []).
|
|
|
|
% /upload
|
|
% /upload_reply
|
|
%
|
|
% Provide a form for uploading a file, and deal with the resulting
|
|
% upload. Contributed by Nicos Angelopoulos.
|
|
|
|
reply(Request) :-
|
|
member(path('/upload'), Request), !,
|
|
format('Content-type: text/html~n~n', []),
|
|
format('<html>~n', []),
|
|
format('<form action="/upload_reply" enctype="multipart/form-data" method="post">~n', []),
|
|
format('<input type="file" name="datafile">'),
|
|
format('<input type="submit" name="sent">'),
|
|
format('</body>~n', []),
|
|
format('</html>~n', []).
|
|
|
|
reply(Request) :-
|
|
member(path('/upload_reply'), Request), !,
|
|
format('Content-type: text/html~n~n', []),
|
|
format('<html>~n', []),
|
|
format('<pre>~n', []),
|
|
write( req(Request) ), nl,
|
|
http_read_data(Request, Data, []),
|
|
write( data(Data) ), nl,
|
|
format('</pre>'),
|
|
format('</body>~n', []),
|
|
format('</html>~n', []).
|
|
|
|
% /xml
|
|
%
|
|
% Return a simple formatted XML message.
|
|
|
|
reply(Request) :-
|
|
member(path('/xml'), Request), !,
|
|
format('Content-type: text/xml~n~n', []),
|
|
format('\
|
|
<message>
|
|
<head>
|
|
<from>Jan Wielemaker</from>
|
|
<to>Prolog users</to>
|
|
<subject>The SWI-Prolog web-server</subject>
|
|
</head>
|
|
<body>
|
|
<p>
|
|
This is the first demo of the web-server serving an XML message
|
|
</p>
|
|
</body>
|
|
</message>
|
|
', []).
|
|
|
|
% /foreign
|
|
%
|
|
% Test emitting text using UTF-8 encoding
|
|
|
|
reply(Request) :-
|
|
member(path('/foreign'), Request), !,
|
|
format('Content-type: text/html~n~n', []),
|
|
format('\
|
|
<html>
|
|
<head><title>Foreign characters</title></head>
|
|
<body>
|
|
<p>Chinese for book is ~s
|
|
</body>
|
|
</html>
|
|
',
|
|
[ [23398, 20064]
|
|
]).
|
|
|
|
|
|
% /work
|
|
%
|
|
% Do a lot of work and then say 'ok'. Can be used to test
|
|
% concurrent access using the multi-threaded server.
|
|
|
|
reply(Request) :-
|
|
member(path('/work'), Request),
|
|
format(user_error, 'Starting work ...', []),
|
|
forall(between(1, 10000000, _), atom_codes(_, "hello")),
|
|
format(user_error, 'done!~n', []),
|
|
format('Content-type: text/plain~n~n', []),
|
|
format('ok~n').
|
|
|
|
% /error
|
|
%
|
|
% Produce an error. Load http_error to see the effect.
|
|
|
|
reply(Request) :-
|
|
member(path('/error'), Request),
|
|
A is 1/0,
|
|
format('Content-type: text/plain~n~n', []),
|
|
format('A = ~w~n', [A]).
|
|
|
|
% ... Otherwise
|
|
%
|
|
% Print the request itself.
|
|
|
|
reply(Request) :-
|
|
format('Content-type: text/html~n~n', []),
|
|
format('<html>~n', []),
|
|
format('<table border=1>~n'),
|
|
print_request(Request),
|
|
format('~n</table>~n'),
|
|
format('</html>~n', []).
|
|
|
|
|
|
print_request([]).
|
|
print_request([H|T]) :-
|
|
H =.. [Name, Value],
|
|
format('<tr><td>~w<td>~w~n', [Name, Value]),
|
|
print_request(T).
|
|
|
|
|
|
/*******************************
|
|
* PCE BASED REQUESTS *
|
|
*******************************/
|
|
|
|
pce_reply(Request) :-
|
|
memberchk(search(Search), Request),
|
|
memberchk(class=box, Search),
|
|
new(Box, box(200,200)),
|
|
send(Box, radius, 20),
|
|
send(Box, fill_pattern, colour(skyblue)),
|
|
reply_image(Box, []).
|
|
|
|
|
|
|