213 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			213 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | /*  $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, []). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |