Author: mturk Date: Fri Oct 3 06:37:22 2008 New Revision: 701379 URL: http://svn.apache.org/viewvc?rev=701379&view=rev Log: Use nicer error messages and unify its generation. Also make sure they are larger then 600 bytes, so IE displays them instead his own pages
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=701379&r1=701378&r2=701379&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Fri Oct 3 06:37:22 2008 @@ -164,30 +164,252 @@ #define MAX_INSTANCEID 32 #define MAX_PACKET_SIZE 65536 -char HTML_ERROR_400[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" - "<HTML><HEAD><TITLE>Bad request!</TITLE></HEAD>\n" - "<BODY><H1>Bad request!</H1>\n<P>" - "Your browser (or proxy) sent a request that " - "this server could not understand.</P></BODY></HTML>"; - -char HTML_ERROR_404[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" - "<HTML><HEAD><TITLE>Object not found!</TITLE></HEAD>\n" - "<BODY><H1>The requested URL was not found on this server" - "</H1>\n<P>If you entered the URL manually please check your" - "spelling and try again.</P></BODY></HTML>"; - -char HTML_ERROR_500[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" - "<HTML><HEAD><TITLE>Server error!</TITLE></HEAD>\n" - "<BODY><H1>Internal server error!</H1>\n<P>" - "The server encountered an internal error and was " - "unable to complete your request.</P></BODY></HTML>"; - -char HTML_ERROR_503[] = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" - "<HTML><HEAD><TITLE>Service unavailable!</TITLE></HEAD>\n" - "<BODY><H1>Service temporary unavailable!</H1>\n<P>" - "The server is temporarily unable to service your " - "request due to maintenance downtime or capacity problems. " - "Please try again later.</P></BODY></HTML>"; +char HTML_ERROR_HEAD[] = "<!--\n" + " Licensed to the Apache Software Foundation (ASF) under one or more\n" + " contributor license agreements. See the NOTICE file distributed with\n" + " this work for additional information regarding copyright ownership.\n" + " The ASF licenses this file to You under the Apache License, Version 2.0\n" + " (the \"License\"); you may not use this file except in compliance with\n" + " the License. You may obtain a copy of the License at\n\n" + " http://www.apache.org/licenses/LICENSE-2.0\n\n" + " Unless required by applicable law or agreed to in writing, software\n" + " distributed under the License is distributed on an \"AS IS\" BASIS,\n" + " WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + " See the License for the specific language governing permissions and\n" + " limitations under the License.\n" + " -->\n" + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n" + "\"http://www.w3c.org/TR/REC-html40/loose.dtd\">\n" + "<HTML>\n<HEAD>\n" + "<META http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n" + "<STYLE TYPE=\"text/css\">\n" + " body {\n" + " color: #000000;\n" + " background-color: #FFFFFF;\n" + " font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;\n" + " font-size: 9pt;\n" + " margin: 10px 10px;\n" + " }\n" + " p#footer {\n" + " text-align: right;\n" + " font-size: 80%;\n" + " }\n" + "</STYLE>\n"; + +#define HTML_ERROR_BODY_FMT "<TITLE>%s!</TITLE>\n</HEAD>\n<BODY>\n<H1>%s!</H1>\n<P>\n%s\n</P>\n" + +char HTML_ERROR_TAIL[] = "<P>\n<BR/> <BR/> <BR/> <BR/> \n" + VERSION_STRING "\n" + "<BR/> \n" + "<HR/>\n" + "<P id=\"footer\">\n" + "Copyright © 1999-2008 Apache Software Foundation<BR/>\n" + "All Rights Reserved\n" + "</P>\n</BODY>\n</HTML>\n"; + +static struct error_reasons { + int status; + const char *reason; + const char *title; + const char *description; +} error_reasons[] = { + { 100, + "Continue", + NULL, + NULL + }, + { 101, + "Switching Protocols", + NULL, + NULL + }, + { 200, + "OK", + NULL, + NULL + }, + { 201, + "Created", + NULL, + NULL + }, + { 202, + "Accepted", + NULL, + NULL + }, + { 203, + "Non-Authoritative Information", + NULL, + NULL + }, + { 204, + "No Content", + NULL, + NULL + }, + { 205, + "Reset Content", + NULL, + NULL + }, + { 206, + "Partial Content", + NULL, + NULL + }, + { 300, + "Multiple Choices", + NULL, + NULL + }, + { 301, + "Moved Permanently", + NULL, + NULL + }, + { 302, + "Moved Temporarily", + NULL, + NULL + }, + { 303, + "See Other", + NULL, + NULL + }, + { 304, + "Not Modified", + NULL, + NULL + }, + { 305, + "Use Proxy", + NULL, + NULL + }, + { 400, + "Bad Request", + "Bad Request", + "Your browser (or proxy) sent a request that " + "this server could not understand." + }, + { 401, + "Unauthorized", + NULL, + NULL + }, + { 402, + "Payment Required", + NULL, + NULL + }, + { 403, + "Forbidden", + NULL, + NULL + }, + { 404, + "Not Found", + "The requested URL was not found on this server", + "If you entered the URL manually please check your" + "spelling and try again." + }, + { 405, + "Method Not Allowed", + NULL, + NULL + }, + { 406, + "Not Acceptable", + NULL, + NULL + }, + { 407, + "Proxy Authentication Required", + NULL, + NULL + }, + { 408, + "Request Timeout", + NULL, + NULL + }, + { 409, + "Conflict", + NULL, + NULL + }, + { 410, + "Gone", + NULL, + NULL + }, + { 411, + "Length Required", + NULL, + NULL + }, + { 412, + "Precondition Failed", + NULL, + NULL + }, + { 413, + "Request Entity Too Large", + NULL, + NULL + }, + { 414, + "Request-URI Too Long", + NULL, + NULL + }, + { 415, + "Unsupported Media Type", + NULL, + NULL + }, + { 500, + "Internal Server Error", + NULL, + "The server encountered an internal error and was " + "unable to complete your request." + }, + { 501, + "Not Implemented", + NULL, + NULL + }, + { 502, + "Bad Gateway", + NULL, + NULL + }, + { 503, + "Service Unavailable", + "Service Temporary Unavailable", + "The server is temporarily unable to service your " + "request due to maintenance downtime or capacity problems. " + "Please try again later." + }, + { 504, + "Gateway Timeout", + NULL, + NULL + }, + { 505, + "HTTP Version Not Supported", + NULL, + NULL + }, + { 0, + NULL, + NULL, + NULL + } +}; + #define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)") @@ -484,61 +706,56 @@ return where; } -static char *status_reason(int status) +static const char *status_reason(int status) { - static struct reasons { - int status; - char *reason; - } *r, reasons[] = { - { 100, "Continue" }, - { 101, "Switching Protocols" }, - { 200, "OK" }, - { 201, "Created" }, - { 202, "Accepted" }, - { 203, "Non-Authoritative Information" }, - { 204, "No Content" }, - { 205, "Reset Content" }, - { 206, "Partial Content" }, - { 300, "Multiple Choices" }, - { 301, "Moved Permanently" }, - { 302, "Moved Temporarily" }, - { 303, "See Other" }, - { 304, "Not Modified" }, - { 305, "Use Proxy" }, - { 400, "Bad Request" }, - { 401, "Unauthorized" }, - { 402, "Payment Required" }, - { 403, "Forbidden" }, - { 404, "Not Found" }, - { 405, "Method Not Allowed" }, - { 406, "Not Acceptable" }, - { 407, "Proxy Authentication Required" }, - { 408, "Request Timeout" }, - { 409, "Conflict" }, - { 410, "Gone" }, - { 411, "Length Required" }, - { 412, "Precondition Failed" }, - { 413, "Request Entity Too Large" }, - { 414, "Request-URI Too Long" }, - { 415, "Unsupported Media Type" }, - { 500, "Internal Server Error" }, - { 501, "Not Implemented" }, - { 502, "Bad Gateway" }, - { 503, "Service Unavailable" }, - { 504, "Gateway Timeout" }, - { 505, "HTTP Version Not Supported" }, - { 000, NULL} - }; + struct error_reasons *r; - r = reasons; - while (r->status <= status) + r = error_reasons; + while (r->status <= status) { if (r->status == status) return r->reason; else r++; + } return "No Reason"; } +static const char *status_title(int status) +{ + struct error_reasons *r; + + r = error_reasons; + while (r->status <= status) { + if (r->status == status) { + if (r->title) + return r->title; + else + return r->reason; + } + else + r++; + } + return "Unknown Error"; +} + +static const char *status_description(int status) +{ + struct error_reasons *r; + + r = error_reasons; + while (r->status <= status) { + if (r->status == status) { + if (r->description) + return r->description; + else + return r->reason; + } + else + r++; + } + return "Unknown Error"; +} + static int escape_url(const char *path, char *dest, int destsize) { const BYTE *s = (const BYTE *)path; @@ -596,23 +813,37 @@ return JK_FALSE; } -static void write_error_response(PHTTP_FILTER_CONTEXT pfc, char *status, - char *msg) +static void write_error_response(PHTTP_FILTER_CONTEXT pfc, int err) { - DWORD len = (DWORD)strlen(msg); + char status[MAX_PATH]; + char body[8192] = ""; + DWORD len; /* reject !!! */ pfc->AddResponseHeaders(pfc, CONTENT_TYPE, 0); + StringCbPrintf(status, MAX_PATH, "%d %s", err, status_reason(err)); pfc->ServerSupportFunction(pfc, SF_REQ_SEND_RESPONSE_HEADER, status, 0, 0); - pfc->WriteClient(pfc, msg, &len, HSE_IO_SYNC); + len = (DWORD)(sizeof(HTML_ERROR_HEAD) - 1); + pfc->WriteClient(pfc, HTML_ERROR_HEAD, &len, + HSE_IO_SYNC); + StringCbPrintf(body, sizeof(body), HTML_ERROR_BODY_FMT, + status_reason(err), status_title(err), + status_description(err)); + len = (DWORD)(strlen(body)); + pfc->WriteClient(pfc, body, &len, + HSE_IO_SYNC); + len = (DWORD)(sizeof(HTML_ERROR_TAIL) - 1); + pfc->WriteClient(pfc, HTML_ERROR_TAIL, &len, + HSE_IO_SYNC); } static void write_error_message(LPEXTENSION_CONTROL_BLOCK lpEcb, int err) { DWORD len; char status[MAX_PATH]; + char body[8192] = ""; if (error_page) { char error_page_url[INTERNET_MAX_URL_LENGTH] = ""; @@ -633,22 +864,29 @@ } lpEcb->dwHttpStatusCode = err; - StringCbPrintf(status, MAX_PATH, "%s %s", err, status_reason(err)); + StringCbPrintf(status, MAX_PATH, "%d %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 { - len = (DWORD)(sizeof(HTML_ERROR_500) - 1); - lpEcb->WriteClient(lpEcb->ConnID, - HTML_ERROR_500, &len, HSE_IO_SYNC); - } + /* First write the HEAD */ + len = (DWORD)(sizeof(HTML_ERROR_HEAD) - 1); + lpEcb->WriteClient(lpEcb->ConnID, + HTML_ERROR_HEAD, &len, + HSE_IO_SYNC); + StringCbPrintf(body, sizeof(body), HTML_ERROR_BODY_FMT, + status_reason(err), status_title(err), + status_description(err)); + len = (DWORD)(strlen(body)); + lpEcb->WriteClient(lpEcb->ConnID, + body, &len, + HSE_IO_SYNC); + len = (DWORD)(sizeof(HTML_ERROR_TAIL) - 1); + lpEcb->WriteClient(lpEcb->ConnID, + HTML_ERROR_TAIL, &len, + HSE_IO_SYNC); + } @@ -1597,16 +1835,14 @@ jk_log(logger, JK_LOG_ERROR, "[%s] contains one or more invalid escape sequences.", uri); - write_error_response(pfc, "400 Bad Request", - HTML_ERROR_400); + write_error_response(pfc, 400); return SF_STATUS_REQ_FINISHED; } else if (rc == BAD_PATH) { jk_log(logger, JK_LOG_EMERG, "[%s] contains forbidden escape sequences.", uri); - write_error_response(pfc, "404 Not Found", - HTML_ERROR_404); + write_error_response(pfc, 404); return SF_STATUS_REQ_FINISHED; } getparents(uri); @@ -1657,8 +1893,7 @@ "Somebody tries to hack into the site!!!", uri); - write_error_response(pfc, "404 Not Found", - HTML_ERROR_404); + write_error_response(pfc, 404); return SF_STATUS_REQ_FINISHED; } @@ -1686,8 +1921,7 @@ jk_log(logger, JK_LOG_ERROR, "[%s] re-encoding request exceeds maximum buffer size.", uri); - write_error_response(pfc, "400 Bad Request", - HTML_ERROR_400); + write_error_response(pfc, 400); return SF_STATUS_REQ_FINISHED; } if (JK_IS_DEBUG_LEVEL(logger)) @@ -1701,8 +1935,7 @@ jk_log(logger, JK_LOG_ERROR, "[%s] re-encoding request exceeds maximum buffer size.", uri); - write_error_response(pfc, "400 Bad Request", - HTML_ERROR_400); + write_error_response(pfc, 400); return SF_STATUS_REQ_FINISHED; } if (JK_IS_DEBUG_LEVEL(logger)) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]