diff --git a/library/server/ewsgi/connectors/cgi/src/wgi_cgi_connector.e b/library/server/ewsgi/connectors/cgi/src/wgi_cgi_connector.e index e4a23692..cc4abb68 100644 --- a/library/server/ewsgi/connectors/cgi/src/wgi_cgi_connector.e +++ b/library/server/ewsgi/connectors/cgi/src/wgi_cgi_connector.e @@ -38,12 +38,12 @@ feature -- Execution exec.execute res.push exec.clean + elseif exec /= Void then + exec.execute_rescue ((create {EXCEPTION_MANAGER}).last_exception) + exec.clean else - process_rescue (res) - if exec /= Void then - exec.clean - end - end + (create {WGI_RESCUE_EXECUTION}).execute (req, res, (create {EXCEPTION_MANAGER}).last_exception) + end rescue if not rescued then rescued := True @@ -51,24 +51,6 @@ feature -- Execution end end - process_rescue (res: detachable WGI_RESPONSE) - -- Handle rescued execution of current request. - do - if attached (create {EXCEPTION_MANAGER}).last_exception as e and then attached e.trace as l_trace then - if res /= Void then - if not res.status_is_set then - res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error, Void) - end - if res.message_writable then - res.put_string ("
")
- res.put_string (html_encoder.encoded_string (l_trace))
- res.put_string ("")
- end
- res.push
- end
- end
- end
-
note
copyright: "2011-2015, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
diff --git a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e
index 88c74ecc..910620b6 100644
--- a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e
+++ b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e
@@ -73,12 +73,12 @@ feature -- Execution
exec.execute
res.push
exec.clean
+ elseif exec /= Void then
+ exec.execute_rescue ((create {EXCEPTION_MANAGER}).last_exception)
+ exec.clean
else
- process_rescue (res)
- if exec /= Void then
- exec.clean
- end
- end
+ (create {WGI_RESCUE_EXECUTION}).execute (req, res, (create {EXCEPTION_MANAGER}).last_exception)
+ end
rescue
if not rescued then
rescued := True
@@ -86,24 +86,6 @@ feature -- Execution
end
end
- process_rescue (res: detachable WGI_RESPONSE)
- -- Handle rescued execution of current request.
- do
- if attached (create {EXCEPTION_MANAGER}).last_exception as e and then attached e.trace as l_trace then
- if res /= Void then
- if not res.status_is_set then
- res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error, Void)
- end
- if res.message_writable then
- res.put_string ("")
- res.put_string (html_encoder.encoded_string (l_trace))
- res.put_string ("")
- end
- res.push
- end
- end
- end
-
feature -- Input/Output
input: WGI_LIBFCGI_INPUT_STREAM
diff --git a/library/server/ewsgi/connectors/standalone/src/implementation/wgi_httpd_request_handler.e b/library/server/ewsgi/connectors/standalone/src/implementation/wgi_httpd_request_handler.e
index 1c3f8d60..f5db7a55 100644
--- a/library/server/ewsgi/connectors/standalone/src/implementation/wgi_httpd_request_handler.e
+++ b/library/server/ewsgi/connectors/standalone/src/implementation/wgi_httpd_request_handler.e
@@ -88,14 +88,16 @@ feature -- Request processing
exec.execute
res.push
exec.clean
- else
+ elseif exec /= Void then
if not has_error then
- process_rescue (res)
+ exec.execute_rescue ((create {EXCEPTION_MANAGER}).last_exception)
end
- if exec /= Void then
- exec.clean
- end
- end
+ exec.clean
+ elseif not has_error then
+ (create {WGI_RESCUE_EXECUTION}).execute (req, res, (create {EXCEPTION_MANAGER}).last_exception)
+ else
+ -- Bad error.
+ end
rescue
if l_output = Void or else not l_output.is_available then
report_error ("Missing WGI output")
@@ -106,31 +108,6 @@ feature -- Request processing
end
end
-
- process_rescue (res: detachable WGI_RESPONSE)
- local
- s: STRING
- do
- if attached (create {EXCEPTION_MANAGER}).last_exception as e and then attached e.trace as l_trace then
- if res /= Void then
- if not res.status_is_set then
- res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error, Void)
- end
- create s.make_empty
- s.append ("")
- s.append (html_encoder.encoded_string (l_trace))
- s.append ("")
- if not res.header_committed then
- res.put_header_text ("Content-Type: text/html%R%NContent-Length: " + s.count.out + "%R%N%R%N")
- end
- if res.message_writable then
- res.put_string (s)
- end
- res.push
- end
- end
- end
-
httpd_environment (a_socket: HTTPD_STREAM_SOCKET): STRING_TABLE [READABLE_STRING_8]
local
p: INTEGER
diff --git a/library/server/ewsgi/specification/connector/wgi_execution.e b/library/server/ewsgi/specification/connector/wgi_execution.e
index d74f4ad1..49182149 100644
--- a/library/server/ewsgi/specification/connector/wgi_execution.e
+++ b/library/server/ewsgi/specification/connector/wgi_execution.e
@@ -42,6 +42,14 @@ feature -- Execution
is_valid_end_of_execution: is_valid_end_of_execution
end
+feature {WGI_EXPORTER, WGI_CONNECTOR} -- Execution: rescue
+
+ execute_rescue (e: detachable EXCEPTION)
+ -- Execute on rescue.
+ do
+ (create {WGI_RESCUE_EXECUTION}).execute (request, response, e)
+ end
+
feature -- Status report
is_valid_end_of_execution: BOOLEAN
diff --git a/library/server/ewsgi/specification/connector/wgi_rescue_execution.e b/library/server/ewsgi/specification/connector/wgi_rescue_execution.e
new file mode 100644
index 00000000..d4bd4bdf
--- /dev/null
+++ b/library/server/ewsgi/specification/connector/wgi_rescue_execution.e
@@ -0,0 +1,46 @@
+note
+ description: "Execution when an exception occurred."
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ WGI_RESCUE_EXECUTION
+
+inherit
+ WGI_EXPORTER
+
+ SHARED_HTML_ENCODER
+
+feature -- Execution
+
+ execute (req: detachable WGI_REQUEST; res: detachable WGI_RESPONSE; e: detachable EXCEPTION)
+ -- Exception or internal error occurred, return the eventual trace
+ -- as response.
+ -- `req` and `res` may be available for processing.
+ local
+ s: STRING
+ do
+ if
+ res /= Void and then
+ e /= Void and then
+ attached e.trace as l_trace
+ then
+ if not res.status_is_set then
+ res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error, Void)
+ end
+ create s.make_empty
+ s.append ("")
+ s.append (html_encoder.encoded_string (l_trace))
+ s.append ("")
+ if not res.header_committed then
+ -- Overwrite any header previously set.
+ res.put_header_text ("Content-Type: text/html%R%NContent-Length: " + s.count.out + "%R%N%R%N")
+ end
+ if res.message_writable then
+ res.put_string (s)
+ end
+ res.push
+ end
+ end
+
+end