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(_,_)).
|