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