93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | /*  $Id$ | ||
|  | 
 | ||
|  |     Part of SWI-Prolog | ||
|  | 
 | ||
|  |     Author:        Jan Wielemaker | ||
|  |     E-mail:        wielemak@science.uva.nl | ||
|  |     WWW:           http://www.swi-prolog.org | ||
|  |     Copyright (C): Public domain | ||
|  | */ | ||
|  | 
 | ||
|  | :- use_module(library('http/thread_httpd')). | ||
|  | :- use_module(library('http/html_write')). | ||
|  | :- use_module(library('http/http_session')). | ||
|  | :- use_module(library('http/http_error')). | ||
|  | 
 | ||
|  | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
|  | This demo shows session state  management   in  a very simple calculator | ||
|  | package. It also demonstrates the use of  the html_write library. To use | ||
|  | it, start Prolog, load this file and run | ||
|  | 
 | ||
|  | 	?- server. | ||
|  | 
 | ||
|  | Now direct your browser to http://localhost:3000/ | ||
|  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
|  | 
 | ||
|  | server :- | ||
|  | 	server(3000, []). | ||
|  | 
 | ||
|  | server(Port, Options) :- | ||
|  | 	http_server(reply, | ||
|  | 		    [ port(Port), | ||
|  | 		      timeout(20) | ||
|  | 		    | Options | ||
|  | 		    ]). | ||
|  | 
 | ||
|  | reply(Request) :- | ||
|  | 	memberchk(path(Path), Request), | ||
|  | 	reply(Path, Request). | ||
|  | 
 | ||
|  | reply(/, _Request) :- | ||
|  | 	http_session_retractall(formula(_)), | ||
|  | 	Formula = 0, | ||
|  | 	http_session_assert(formula(Formula)), | ||
|  | 	page(Formula). | ||
|  | 
 | ||
|  | reply('/calc', Request) :- | ||
|  | 	memberchk(search(Search), Request), | ||
|  | 	memberchk(operation=Op, Search), | ||
|  | 	memberchk(value=AtomVal, Search), | ||
|  | 	atom_number(AtomVal, Val), | ||
|  | 	http_session_retract(formula(Formula0)), | ||
|  | 	debug(calc, 'Formula0 = ~w', [Formula0]), | ||
|  | 	Formula =.. [Op, Formula0, Val], | ||
|  | 	http_session_assert(formula(Formula)), | ||
|  | 	page(Formula). | ||
|  | 
 | ||
|  | 
 | ||
|  | page(Formula) :- | ||
|  | 	reply_page('HTTP Session DEMO', | ||
|  | 		   [ h2('Simple session demo'), | ||
|  | 		     form([ action('/calc'), | ||
|  | 			    method('GET') | ||
|  | 			  ], | ||
|  | 			  table([align(center), border(1)], | ||
|  | 				[ tr(td(\formula(Formula))), | ||
|  | 				  tr(td([ \ops, | ||
|  | 					  input([ name(value) ]), | ||
|  | 					  input([ type(submit), | ||
|  | 						  value('Calc!') | ||
|  | 						]) | ||
|  | 					])) | ||
|  | 				])) | ||
|  | 		   ]). | ||
|  | 
 | ||
|  | formula(Formula) --> | ||
|  | 	{ sformat(S, '~w', [Formula]), | ||
|  | 	  Value is Formula | ||
|  | 	}, | ||
|  | 	html([ S, ' = ', Value ]). | ||
|  | 
 | ||
|  | ops --> | ||
|  | 	html(select(name(operation), | ||
|  | 		    [ option([selected], +), | ||
|  | 		      option([], -), | ||
|  | 		      option([], /), | ||
|  | 		      option([], *) | ||
|  | 		    ])). | ||
|  | 
 | ||
|  | reply_page(Title, Content) :- | ||
|  | 	phrase(page(title(Title), Content), HTML), | ||
|  | 	format('Content-type: text/html~n~n'), | ||
|  | 	print_html(HTML). |