You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2011/11/08 19:34:56 UTC

svn commit: r1199382 - in /tomcat/jk/trunk: native/iis/jk_isapi_plugin.c xdocs/miscellaneous/changelog.xml

Author: mturk
Date: Tue Nov  8 18:34:56 2011
New Revision: 1199382

URL: http://svn.apache.org/viewvc?rev=1199382&view=rev
Log:
Implement BZ51253 on IIS as well

Modified:
    tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
    tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/jk_isapi_plugin.c?rev=1199382&r1=1199381&r2=1199382&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Tue Nov  8 18:34:56 2011
@@ -531,6 +531,7 @@ struct isapi_private_data_t
 
     unsigned int bytes_read_so_far;
     int chunk_content;          /* Whether we're responding with Transfer-Encoding: chunked content */
+    char *err_hdrs;
     LPEXTENSION_CONTROL_BLOCK lpEcb;
 };
 
@@ -903,7 +904,7 @@ static void write_error_response(PHTTP_F
                      HSE_IO_SYNC);
 }
 
-static void write_error_message(LPEXTENSION_CONTROL_BLOCK lpEcb, int err)
+static void write_error_message(LPEXTENSION_CONTROL_BLOCK lpEcb, int err, const char *err_hdrs)
 {
     DWORD len;
     char status[1024];
@@ -927,13 +928,27 @@ static void write_error_message(LPEXTENS
         }
     }
     lpEcb->dwHttpStatusCode = err;
-
     StringCbPrintf(status, sizeof(status), "%d %s", err, status_reason(err));
+    /* XXX: Should we allow something beside 401?
+     */
+    if (err_hdrs && err == 401) {
+        /* Include extra error headers */
+        HRESULT hr = StringCbCopy(body, sizeof(body), err_hdrs);
+        if (FAILED(hr) || strlen(body) > (8191 - strlen(CONTENT_TYPE))) {
+            /* Header is too long.
+             */
+            jk_log(logger, JK_LOG_WARNING,
+                   "error header too long (%d bytes requested).",
+                   strlen(err_hdrs));
+            body[0] = '\0';
+        }
+    }
+    StringCbCat(body, sizeof(body), CONTENT_TYPE);
     lpEcb->ServerSupportFunction(lpEcb->ConnID,
                                  HSE_REQ_SEND_RESPONSE_HEADER,
                                  status,
                                  0,
-                                 (LPDWORD)CONTENT_TYPE);
+                                 (LPDWORD)body);
     /* First write the HEAD */
     len = ISIZEOF(HTML_ERROR_HEAD) - 1;
     lpEcb->WriteClient(lpEcb->ConnID,
@@ -984,12 +999,9 @@ static int JK_METHOD start_response(jk_w
                 unsigned int h;
                 for (h = 0; h < num_of_headers; h++) {
                     if (!strcasecmp(header_names[h], "WWW-Authenticate")) {
-                        /*
-                         * TODO: we need to save a copy of header_values[h]
-                         * for later reuse in write_error_message()
-                         * which is called later on form HttpExtensionProc
-                         * because of use_server_error_pages.
-                         */
+                        p->err_hdrs = jk_pool_strcatv(&p->p,
+                                            "WWW-Authenticate:",
+                                            header_values[h], CRLF, NULL);
                         found = JK_TRUE;
                     }
                 }
@@ -2295,7 +2307,8 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI
                                        " for worker=%s",
                                        s.http_response_status, worker_name);
                             lpEcb->dwHttpStatusCode = s.http_response_status;
-                            write_error_message(lpEcb, s.http_response_status);
+                            write_error_message(lpEcb, s.http_response_status,
+                                                private_data.err_hdrs);
                         }
                         else {
                             rc = HSE_STATUS_SUCCESS;
@@ -2315,7 +2328,7 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI
                                    "service() failed with http error %d", is_error);
                         }
                         lpEcb->dwHttpStatusCode = is_error;
-                        write_error_message(lpEcb, is_error);
+                        write_error_message(lpEcb, is_error, private_data.err_hdrs);
                     }
                     e->done(&e, logger);
                 }

Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1199382&r1=1199381&r2=1199382&view=diff
==============================================================================
--- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Tue Nov  8 18:34:56 2011
@@ -44,6 +44,10 @@
   <br />
   <subsection name="Native">
     <changelog>
+      <fix>
+        <bug>51253</bug>: Forward WWW-Authenticate header when using
+        server generated error pages (rjung, mturk).
+      </fix>        
       <update>
         <bug>46406</bug>: IIS: Support relative paths in configuration.
         The paths are presumed to be relative from isapi_redirect.dll. (mturk)



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org