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 2007/03/22 20:38:20 UTC
svn commit: r521419 -
/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c
Author: mturk
Date: Thu Mar 22 12:38:19 2007
New Revision: 521419
URL: http://svn.apache.org/viewvc?view=rev&rev=521419
Log:
Fix regexp parsing and add error pages if extension fails instead sending empty page.
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?view=diff&rev=521419&r1=521418&r2=521419
==============================================================================
--- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Thu Mar 22 12:38:19 2007
@@ -109,17 +109,30 @@
#define BAD_PATH -2
#define MAX_SERVERNAME 128
-#define HTML_ERROR_400 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" \
- "<HTML><HEAD><TITLE>Bad request!</TITLE></HEAD>" \
- "<BODY><H1>Bad request!</H1><DL><DD>\n" \
- "Your browser (or proxy) sent a request that " \
- "this server could not understand.</DL></DD></BODY></HTML>"
-
-#define HTML_ERROR_404 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">" \
- "<HTML><HEAD><TITLE>Object not found!</TITLE></HEAD>" \
- "<BODY><H1>The requested URL was not found on this server" \
- "</H1><DL><DD>\nIf you entered the URL manually please check your" \
- "spelling and try again.</DL></DD></BODY></HTML>"
+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>";
#define JK_TOLOWER(x) ((char)tolower((BYTE)(x)))
@@ -517,6 +530,34 @@
pfc->WriteClient(pfc, msg, &len, 0);
}
+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_503, &len, 0);
+ }
+ else if (err == 503) {
+ lpEcb->ServerSupportFunction(lpEcb->ConnID,
+ HSE_REQ_SEND_RESPONSE_HEADER,
+ "503 Service Unavailable",
+ 0,
+ (LPDWORD)CONTENT_TYPE);
+ len = (DWORD)(sizeof(HTML_ERROR_503) - 1);
+ lpEcb->WriteClient(lpEcb->ConnID,
+ HTML_ERROR_503, &len, 0);
+ }
+ else {
+ return;
+ }
+}
+
static int JK_METHOD start_response(jk_ws_service_t *s,
int status,
@@ -778,6 +819,8 @@
void *re_pcre;
size_t re_nsub;
size_t re_erroffset;
+ const char *real;
+ const char *fake;
} ap_regex_t;
/* The structure in which a captured offset is returned. */
@@ -915,8 +958,8 @@
if (rc == 0)
rc = nmatch; /* All captured slots were filled in */
if (rc >= 0) {
- size_t i;
- for (i = 0; i < (size_t)rc; i++) {
+ int i;
+ for (i = 0; i < rc; i++) {
pmatch[i].rm_so = ovector[i*2];
pmatch[i].rm_eo = ovector[i*2+1];
}
@@ -1058,20 +1101,17 @@
if (rregexp_map) {
int i;
for (i = 0; i < jk_map_size(rregexp_map); i++) {
- const char *src = jk_map_name_at(rregexp_map, i);
ap_regex_t *regexp = (ap_regex_t *)jk_map_value_at(rregexp_map, i);
-
if (!ap_regexec(regexp, uri, AP_MAX_REG_MATCH, regm, 0)) {
- char *subs = ap_pregsub(src, uri,
+ char *subs = ap_pregsub(regexp->fake, uri,
AP_MAX_REG_MATCH, regm);
if (subs) {
+ char buf[INTERNET_MAX_URL_LENGTH];
size_t diffsz = strlen(subs) - (regm[0].rm_eo - regm[0].rm_so);
- char *buf = malloc(INTERNET_MAX_URL_LENGTH);
- memcpy(buf, uri, regm[0].rm_so);
- StringCbCopy(buf + regm[0].rm_so, INTERNET_MAX_URL_LENGTH, subs);
- StringCbCat(buf, INTERNET_MAX_URL_LENGTH, uri + regm[0].rm_eo);
- StringCbCopy(uri, INTERNET_MAX_URL_LENGTH, buf);
- free(buf);
+ memcpy(&buf[0], uri, regm[0].rm_so);
+ StringCbCopy(&buf[regm[0].rm_so], INTERNET_MAX_URL_LENGTH - regm[0].rm_so, subs);
+ StringCbCat(&buf[0], INTERNET_MAX_URL_LENGTH, uri + regm[0].rm_eo);
+ StringCbCopy(uri, INTERNET_MAX_URL_LENGTH, &buf[0]);
free(subs);
return 1;
}
@@ -1456,9 +1496,10 @@
"service() returned OK");
}
else {
- lpEcb->dwHttpStatusCode = is_error;
jk_log(logger, JK_LOG_ERROR,
- "service() failed");
+ "service() failed with http error %d", is_error);
+ lpEcb->dwHttpStatusCode = is_error;
+ write_error_message(lpEcb, is_error);
}
e->done(&e, logger);
}
@@ -1509,7 +1550,20 @@
}
if (workers_map) {
jk_map_free(&workers_map);
- workers_map = NULL;
+ }
+ if (rewrite_map) {
+ jk_map_free(&rewrite_map);
+ }
+ if (rregexp_map) {
+ int i;
+ for (i = 0; i < jk_map_size(rregexp_map); i++) {
+ ap_regex_t *regexp = (ap_regex_t *)jk_map_value_at(rregexp_map, i);
+ if (regexp) {
+ ap_regfree(regexp);
+ free(regexp);
+ }
+ }
+ jk_map_free(&rregexp_map);
}
wc_close(logger);
if (logger) {
@@ -1616,7 +1670,7 @@
}
if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) {
- if (jk_map_read_properties(rewrite_map, rewrite_rule_file, NULL, 1, logger)) {
+ if (jk_map_load_properties(rewrite_map, rewrite_rule_file, NULL, logger)) {
int i;
if (JK_IS_DEBUG_LEVEL(logger)) {
jk_log(logger, JK_LOG_DEBUG, "Loaded rewrite rule file %s.",
@@ -1627,12 +1681,23 @@
for (i = 0; i < jk_map_size(rewrite_map); i++) {
const char *src = jk_map_name_at(rewrite_map, i);
if (*src == '~') {
- ap_regex_t *regexp = malloc(sizeof(ap_regex_t *));
+ ap_regex_t *regexp = malloc(sizeof(ap_regex_t));
const char *val = jk_map_value_at(rewrite_map, i);
- if (!ap_regcomp(regexp, val, AP_REG_EXTENDED)) {
- jk_map_add(rregexp_map, val, regexp);
+ /* Skip leading tilde */
+ regexp->real = src + 1;
+ regexp->fake = val;
+ if (!ap_regcomp(regexp, regexp->real, AP_REG_EXTENDED)) {
+ jk_map_add(rregexp_map, regexp->real, regexp);
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Added regular expression rule %s -> %s",
+ regexp->real, regexp->fake);
+ }
}
else {
+ jk_log(logger, JK_LOG_ERROR,
+ "Unable to compile regular expression %s",
+ regexp->real);
free(regexp);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org