113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/*  Part of SWI-Prolog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Jan Wielemaker
							 | 
						||
| 
								 | 
							
								    E-mail:        J.Wielemaker@uva.nl
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 2009, 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 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(http_exception,
							 | 
						||
| 
								 | 
							
									  [ map_exception_to_http_status/3
							 | 
						||
| 
								 | 
							
									  ]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** <module> Internal module of the HTTP server
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@see	http_header.pl, http_wrapper.pl
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%	map_exception_to_http_status(+Exception, -Reply, -HdrExtra)
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%	Map certain defined  exceptions  to   special  reply  codes. The
							 | 
						||
| 
								 | 
							
								%	http(not_modified)   provides   backward     compatibility    to
							 | 
						||
| 
								 | 
							
								%	http_reply(not_modified).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(http(not_modified),
							 | 
						||
| 
								 | 
							
									      not_modified,
							 | 
						||
| 
								 | 
							
									      [connection('Keep-Alive')]) :- !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(http_reply(Reply),
							 | 
						||
| 
								 | 
							
									      Reply,
							 | 
						||
| 
								 | 
							
									      [connection(Close)]) :- !,
							 | 
						||
| 
								 | 
							
									(   keep_alive(Reply)
							 | 
						||
| 
								 | 
							
									->  Close = 'Keep-Alive'
							 | 
						||
| 
								 | 
							
									;   Close = close
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(http_reply(Reply, HdrExtra0),
							 | 
						||
| 
								 | 
							
									      Reply,
							 | 
						||
| 
								 | 
							
									      HdrExtra) :- !,
							 | 
						||
| 
								 | 
							
									(   memberchk(close(_), HdrExtra0)
							 | 
						||
| 
								 | 
							
									->  HdrExtra = HdrExtra0
							 | 
						||
| 
								 | 
							
									;   HdrExtra = [close(Close)|HdrExtra0],
							 | 
						||
| 
								 | 
							
									    (   keep_alive(Reply)
							 | 
						||
| 
								 | 
							
									    ->  Close = 'Keep-Alive'
							 | 
						||
| 
								 | 
							
									    ;   Close = close
							 | 
						||
| 
								 | 
							
									    )
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(error(existence_error(http_location, Location), _),
							 | 
						||
| 
								 | 
							
									      not_found(Location),
							 | 
						||
| 
								 | 
							
									      [connection(close)]) :- !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(error(permission_error(_, http_location, Location), _),
							 | 
						||
| 
								 | 
							
									      forbidden(Location),
							 | 
						||
| 
								 | 
							
									      [connection(close)]) :- !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(error(threads_in_pool(_Pool), _),
							 | 
						||
| 
								 | 
							
									      busy,
							 | 
						||
| 
								 | 
							
									      [connection(close)]) :- !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(E,
							 | 
						||
| 
								 | 
							
									      resource_error(E),
							 | 
						||
| 
								 | 
							
									      [connection(close)]) :-
							 | 
						||
| 
								 | 
							
									resource_error(E), !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(E,
							 | 
						||
| 
								 | 
							
									      bad_request(E),
							 | 
						||
| 
								 | 
							
									      [connection(close)]) :-
							 | 
						||
| 
								 | 
							
									bad_request_error(E), !.
							 | 
						||
| 
								 | 
							
								map_exception_to_http_status(E,
							 | 
						||
| 
								 | 
							
									      server_error(E),
							 | 
						||
| 
								 | 
							
									      [connection(close)]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource_error(error(resource_error(_), _)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bad_request_error(error(domain_error(http_request, _), _)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%	keep_alive(+Reply) is semidet.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%	If true for Reply, the default is to keep the connection open.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								keep_alive(not_modified).
							 | 
						||
| 
								 | 
							
								keep_alive(file(_Type, _File)).
							 | 
						||
| 
								 | 
							
								keep_alive(tmp_file(_Type, _File)).
							 | 
						||
| 
								 | 
							
								keep_alive(stream(_In, _Len)).
							 | 
						||
| 
								 | 
							
								keep_alive(cgi_stream(_In, _Len)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										 /*******************************
							 | 
						||
| 
								 | 
							
										 *	    IDE SUPPORT		*
							 | 
						||
| 
								 | 
							
										 *******************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% See library('trace/exceptions')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- multifile
							 | 
						||
| 
								 | 
							
									prolog:general_exception/2.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prolog:general_exception(http_reply(_), http_reply(_)).
							 | 
						||
| 
								 | 
							
								prolog:general_exception(http_reply(_,_), http_reply(_,_)).
							 |