Author: mturk
Date: Thu Oct  2 07:06:48 2008
New Revision: 701131

URL: http://svn.apache.org/viewvc?rev=701131&view=rev
Log:
Implement use_server_error+pages extension for IIS

Modified:
    tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c

Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c?rev=701131&r1=701130&r2=701131&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Thu Oct  2 07:06:48 
2008
@@ -612,28 +612,42 @@
 static void write_error_message(LPEXTENSION_CONTROL_BLOCK lpEcb, int err)
 {
     DWORD len;
-    if (err = 500) {
-        lpEcb->ServerSupportFunction(lpEcb->ConnID,
-                                     HSE_REQ_SEND_RESPONSE_HEADER,
-                                     "500 Internal Server Error",
-                                     0,
-                                     (LPDWORD)CONTENT_TYPE);
-        len = (DWORD)(sizeof(HTML_ERROR_500) - 1);
-        lpEcb->WriteClient(lpEcb->ConnID,
-                           HTML_ERROR_500, &len, HSE_IO_SYNC);
+    char status[MAX_PATH];
+
+    if (error_page) {
+        char error_page_url[INTERNET_MAX_URL_LENGTH] = "";
+        int len_of_error_page;
+        StringCbPrintf(error_page_url, INTERNET_MAX_URL_LENGTH,
+                       (LPCSTR)error_page, err);
+        len_of_error_page = (int)strlen(error_page_url);
+        if (!lpEcb->ServerSupportFunction(lpEcb->ConnID,
+                                          HSE_REQ_SEND_URL_REDIRECT_RESP,
+                                          error_page_url,
+                                          (LPDWORD)&len_of_error_page,
+                                          (LPDWORD)NULL)) {
+            lpEcb->dwHttpStatusCode = err;
+        }
+        else {
+            return;
+        }
     }
-    else if (err == 503) {
-        lpEcb->ServerSupportFunction(lpEcb->ConnID,
-                                     HSE_REQ_SEND_RESPONSE_HEADER,
-                                     "503 Service Unavailable",
-                                     0,
-                                     (LPDWORD)CONTENT_TYPE);
+    lpEcb->dwHttpStatusCode = err;
+
+    StringCbPrintf(status, MAX_PATH, "%s %s", err, status_reason(err));
+    lpEcb->ServerSupportFunction(lpEcb->ConnID,
+                                 HSE_REQ_SEND_RESPONSE_HEADER,
+                                 status,
+                                 0,
+                                 (LPDWORD)CONTENT_TYPE);
+    if (err == 503) {
         len = (DWORD)(sizeof(HTML_ERROR_503) - 1);
         lpEcb->WriteClient(lpEcb->ConnID,
                            HTML_ERROR_503, &len, HSE_IO_SYNC);
     }
     else {
-        return;
+        len = (DWORD)(sizeof(HTML_ERROR_500) - 1);
+        lpEcb->WriteClient(lpEcb->ConnID,
+                           HTML_ERROR_500, &len, HSE_IO_SYNC);
     }
 }
 
@@ -1873,11 +1887,22 @@
                     int is_error = JK_HTTP_SERVER_ERROR;
                     int result;
                     if ((result = e->service(e, &s, logger, &is_error)) > 0) {
-                        rc = HSE_STATUS_SUCCESS;
-                        lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;
-                        if (JK_IS_DEBUG_LEVEL(logger))
-                            jk_log(logger, JK_LOG_DEBUG,
-                                   "service() returned OK");
+                        if (s.extension.use_server_error_pages &&
+                            s.http_response_status >= 
s.extension.use_server_error_pages) {
+                            if (JK_IS_DEBUG_LEVEL(logger))
+                                jk_log(logger, JK_LOG_DEBUG, "Forwarding 
status=%d"
+                                       " for worker=%s",
+                                       s.http_response_status, worker_name);
+                            lpEcb->dwHttpStatusCode = is_error;
+                            write_error_message(lpEcb, is_error);
+                        }
+                        else {
+                            rc = HSE_STATUS_SUCCESS;
+                            lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;
+                            if (JK_IS_DEBUG_LEVEL(logger))
+                                jk_log(logger, JK_LOG_DEBUG,
+                                       "service() returned OK");
+                        }
                     }
                     else {
                         if ((result == JK_CLIENT_ERROR) && (is_error == 
JK_HTTP_OK)) {
@@ -1888,29 +1913,8 @@
                             jk_log(logger, JK_LOG_ERROR,
                                    "service() failed with http error %d", 
is_error);
                         }
-                        /** Try to redirect the client to a page explaining 
the ISAPI redirector is down */
-                        if (error_page) {
-                            char error_page_url[INTERNET_MAX_URL_LENGTH] = "";
-                            int len_of_error_page;
-                            StringCbPrintf(error_page_url, 
INTERNET_MAX_URL_LENGTH,
-                                           (LPCSTR)error_page, is_error);      
                      
-                            len_of_error_page = (int)strlen(error_page_url);
-                            if (!lpEcb->ServerSupportFunction(lpEcb->ConnID,
-                                                              
HSE_REQ_SEND_URL_REDIRECT_RESP,
-                                                              error_page_url,
-                                                              
(LPDWORD)&len_of_error_page,
-                                                              (LPDWORD)NULL)) {
-                                jk_log(logger, JK_LOG_ERROR,
-                                       "HttpExtensionProc error, Error page 
'%s' redirect failed with %d (0x%08x)",
-                                       error_page_url, GetLastError(), 
GetLastError());
-                                lpEcb->dwHttpStatusCode = is_error;
-                                write_error_message(lpEcb, is_error);
-                            }
-                        }
-                        else {
-                            lpEcb->dwHttpStatusCode = is_error;
-                            write_error_message(lpEcb, is_error);
-                        }
+                        lpEcb->dwHttpStatusCode = is_error;
+                        write_error_message(lpEcb, is_error);
                     }
                     e->done(&e, logger);
                 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to