Lines 55-76
Link Here
|
55 |
#define QUERY_HEADER_NAME_BASE ("TOMCATQUERY") |
55 |
#define QUERY_HEADER_NAME_BASE ("TOMCATQUERY") |
56 |
#define WORKER_HEADER_NAME_BASE ("TOMCATWORKER") |
56 |
#define WORKER_HEADER_NAME_BASE ("TOMCATWORKER") |
57 |
#define TOMCAT_TRANSLATE_HEADER_NAME_BASE ("TOMCATTRANSLATE") |
57 |
#define TOMCAT_TRANSLATE_HEADER_NAME_BASE ("TOMCATTRANSLATE") |
58 |
#define CONTENT_LENGTH ("CONTENT_LENGTH:") |
|
|
59 |
/* The template used to construct our unique headers |
60 |
* from the base name and module instance |
61 |
*/ |
62 |
#define HEADER_TEMPLATE ("%s%p:") |
63 |
#define HTTP_HEADER_TEMPLATE ("HTTP_%s%p") |
64 |
|
58 |
|
65 |
static char URI_HEADER_NAME[_MAX_FNAME]; |
59 |
static char URI_HEADER_NAME[_MAX_FNAME]; |
66 |
static char QUERY_HEADER_NAME[_MAX_FNAME]; |
60 |
static char QUERY_HEADER_NAME[_MAX_FNAME]; |
67 |
static char WORKER_HEADER_NAME[_MAX_FNAME]; |
61 |
static char WORKER_HEADER_NAME[_MAX_FNAME]; |
68 |
static char TOMCAT_TRANSLATE_HEADER_NAME[_MAX_FNAME]; |
62 |
static char TOMCAT_TRANSLATE_HEADER_NAME[_MAX_FNAME]; |
69 |
|
63 |
|
|
|
64 |
/** The variants of the special headers after IIS adds HTTP_ to the front of them */ |
70 |
static char HTTP_URI_HEADER_NAME[_MAX_FNAME]; |
65 |
static char HTTP_URI_HEADER_NAME[_MAX_FNAME]; |
71 |
static char HTTP_QUERY_HEADER_NAME[_MAX_FNAME]; |
66 |
static char HTTP_QUERY_HEADER_NAME[_MAX_FNAME]; |
72 |
static char HTTP_WORKER_HEADER_NAME[_MAX_FNAME]; |
67 |
static char HTTP_WORKER_HEADER_NAME[_MAX_FNAME]; |
73 |
|
68 |
|
|
|
69 |
/* The templates used to construct our unique headers |
70 |
from the base name and module instance |
71 |
i.e. X_HEADER_NAME_BASE_<DLL Handle>: */ |
72 |
#define HEADER_TEMPLATE ("%s%p:") |
73 |
/* The HTTP_ form of the header for use in ExtensionProc */ |
74 |
#define HTTP_HEADER_PREFIX ("HTTP_") |
75 |
#define HTTP_HEADER_PREFIX_LEN (5) |
76 |
#define HTTP_HEADER_TEMPLATE ("HTTP_%s") |
77 |
|
74 |
#define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.0") |
78 |
#define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.0") |
75 |
#define EXTENSION_URI_TAG ("extension_uri") |
79 |
#define EXTENSION_URI_TAG ("extension_uri") |
76 |
|
80 |
|
Lines 79-84
Link Here
|
79 |
#define URI_SELECT_UNPARSED_VERB ("unparsed") |
83 |
#define URI_SELECT_UNPARSED_VERB ("unparsed") |
80 |
#define URI_SELECT_ESCAPED_VERB ("escaped") |
84 |
#define URI_SELECT_ESCAPED_VERB ("escaped") |
81 |
|
85 |
|
|
|
86 |
#define CONTENT_LENGTH_HEADER ("Content-Length:") |
87 |
#define CONTENT_LENGTH_HEADER_NAME ("Content-Length") |
88 |
#define CONTENT_LENGTH_HEADER_NAME_LEN (14) |
89 |
|
90 |
#define TRANSLATE_HEADER ("Translate:") |
91 |
#define TRANSLATE_HEADER_NAME ("Translate") |
92 |
#define TRANSLATE_HEADER_NAME_LC ("translate") |
93 |
|
82 |
#define BAD_REQUEST -1 |
94 |
#define BAD_REQUEST -1 |
83 |
#define BAD_PATH -2 |
95 |
#define BAD_PATH -2 |
84 |
#define MAX_SERVERNAME 128 |
96 |
#define MAX_SERVERNAME 128 |
Lines 125-130
Link Here
|
125 |
(place) = def; \ |
137 |
(place) = def; \ |
126 |
} } while(0) |
138 |
} } while(0) |
127 |
|
139 |
|
|
|
140 |
/* HTTP protocol CRLF */ |
141 |
static char CRLF[3] = { (char)13, (char)10, '\0' }; |
142 |
#define CRLF_LEN (2) |
143 |
|
128 |
static char ini_file_name[MAX_PATH]; |
144 |
static char ini_file_name[MAX_PATH]; |
129 |
static int using_ini_file = JK_FALSE; |
145 |
static int using_ini_file = JK_FALSE; |
130 |
static int is_inited = JK_FALSE; |
146 |
static int is_inited = JK_FALSE; |
Lines 480-487
Link Here
|
480 |
const char *const *header_values, |
496 |
const char *const *header_values, |
481 |
unsigned int num_of_headers) |
497 |
unsigned int num_of_headers) |
482 |
{ |
498 |
{ |
483 |
static char crlf[3] = { (char)13, (char)10, '\0' }; |
|
|
484 |
|
485 |
JK_TRACE_ENTER(logger); |
499 |
JK_TRACE_ENTER(logger); |
486 |
if (status < 100 || status > 1000) { |
500 |
if (status < 100 || status > 1000) { |
487 |
jk_log(logger, JK_LOG_ERROR, |
501 |
jk_log(logger, JK_LOG_ERROR, |
Lines 529-540
Link Here
|
529 |
strcat(headers_str, header_names[i]); |
543 |
strcat(headers_str, header_names[i]); |
530 |
strcat(headers_str, ": "); |
544 |
strcat(headers_str, ": "); |
531 |
strcat(headers_str, header_values[i]); |
545 |
strcat(headers_str, header_values[i]); |
532 |
strcat(headers_str, crlf); |
546 |
strcat(headers_str, CRLF); |
533 |
} |
547 |
} |
534 |
strcat(headers_str, crlf); |
548 |
strcat(headers_str, CRLF); |
535 |
} |
549 |
} |
536 |
else { |
550 |
else { |
537 |
headers_str = crlf; |
551 |
headers_str = CRLF; |
538 |
} |
552 |
} |
539 |
|
553 |
|
540 |
if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, |
554 |
if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, |
Lines 907-913
Link Here
|
907 |
* This allows the servlet to handle 'Translate: f'. |
921 |
* This allows the servlet to handle 'Translate: f'. |
908 |
*/ |
922 |
*/ |
909 |
if (GetHeader |
923 |
if (GetHeader |
910 |
(pfc, "Translate:", (LPVOID) Translate, |
924 |
(pfc, TRANSLATE_HEADER, (LPVOID) Translate, |
911 |
(LPDWORD) & szTranslate) && Translate != NULL |
925 |
(LPDWORD) & szTranslate) && Translate != NULL |
912 |
&& szTranslate > 0) { |
926 |
&& szTranslate > 0) { |
913 |
if (!AddHeader |
927 |
if (!AddHeader |
Lines 1109-1121
Link Here
|
1109 |
sprintf(URI_HEADER_NAME, HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst); |
1123 |
sprintf(URI_HEADER_NAME, HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst); |
1110 |
sprintf(QUERY_HEADER_NAME, HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst); |
1124 |
sprintf(QUERY_HEADER_NAME, HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst); |
1111 |
sprintf(WORKER_HEADER_NAME, HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst); |
1125 |
sprintf(WORKER_HEADER_NAME, HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst); |
1112 |
sprintf(TOMCAT_TRANSLATE_HEADER_NAME, HEADER_TEMPLATE, TOMCAT_TRANSLATE_HEADER_NAME_BASE, hInst); |
1126 |
sprintf(TOMCAT_TRANSLATE_HEADER_NAME, HEADER_TEMPLATE, |
1113 |
|
1127 |
TOMCAT_TRANSLATE_HEADER_NAME_BASE, hInst); |
1114 |
sprintf(HTTP_URI_HEADER_NAME, HTTP_HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst); |
|
|
1115 |
sprintf(HTTP_QUERY_HEADER_NAME, HTTP_HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst); |
1116 |
sprintf(HTTP_WORKER_HEADER_NAME, HTTP_HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst); |
1117 |
|
1128 |
|
1118 |
break; |
1129 |
/* Construct the HTTP_ headers that will be seen in ExtensionProc */ |
|
|
1130 |
sprintf(HTTP_URI_HEADER_NAME, HTTP_HEADER_TEMPLATE, URI_HEADER_NAME); |
1131 |
sprintf(HTTP_QUERY_HEADER_NAME, HTTP_HEADER_TEMPLATE, QUERY_HEADER_NAME); |
1132 |
sprintf(HTTP_WORKER_HEADER_NAME, HTTP_HEADER_TEMPLATE, WORKER_HEADER_NAME); |
1133 |
break; |
1119 |
case DLL_PROCESS_DETACH: |
1134 |
case DLL_PROCESS_DETACH: |
1120 |
__try { |
1135 |
__try { |
1121 |
TerminateFilter(HSE_TERM_MUST_UNLOAD); |
1136 |
TerminateFilter(HSE_TERM_MUST_UNLOAD); |
Lines 1163-1168
Link Here
|
1163 |
jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.", |
1178 |
jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.", |
1164 |
worker_mount_file); |
1179 |
worker_mount_file); |
1165 |
jk_log(logger, JK_LOG_DEBUG, "Using uri select %d.", uri_select_option); |
1180 |
jk_log(logger, JK_LOG_DEBUG, "Using uri select %d.", uri_select_option); |
|
|
1181 |
|
1182 |
jk_log(logger, JK_LOG_DEBUG, "Using uri header %s.", URI_HEADER_NAME); |
1183 |
jk_log(logger, JK_LOG_DEBUG, "Using query header %s.", QUERY_HEADER_NAME); |
1184 |
jk_log(logger, JK_LOG_DEBUG, "Using worker header %s.", WORKER_HEADER_NAME); |
1185 |
jk_log(logger, JK_LOG_DEBUG, "Using translate header %s.", TOMCAT_TRANSLATE_HEADER_NAME); |
1186 |
|
1166 |
} |
1187 |
} |
1167 |
if (uri_worker_map_alloc(&uw_map, NULL, logger)) { |
1188 |
if (uri_worker_map_alloc(&uw_map, NULL, logger)) { |
1168 |
rc = JK_FALSE; |
1189 |
rc = JK_FALSE; |
Lines 1522-1531
Link Here
|
1522 |
if (cnt) { |
1543 |
if (cnt) { |
1523 |
char *headers_buf = jk_pool_strdup(&private_data->p, huge_buf); |
1544 |
char *headers_buf = jk_pool_strdup(&private_data->p, huge_buf); |
1524 |
unsigned int i; |
1545 |
unsigned int i; |
1525 |
size_t len_of_http_prefix = strlen("HTTP_"); |
1546 |
size_t len_of_http_prefix = HTTP_HEADER_PREFIX_LEN; |
1526 |
BOOL need_content_length_header = (s->content_length == 0); |
1547 |
BOOL need_content_length_header = (s->content_length == 0); |
1527 |
|
1548 |
|
1528 |
cnt -= 2; /* For our two special headers */ |
1549 |
cnt -= 2; /* For our two special headers (URI,WORKER. QUERY is optional)*/ |
1529 |
/* allocate an extra header slot in case we need to add a content-length header */ |
1550 |
/* allocate an extra header slot in case we need to add a content-length header */ |
1530 |
s->headers_names = |
1551 |
s->headers_names = |
1531 |
jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); |
1552 |
jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); |
Lines 1539-1562
Link Here
|
1539 |
for (i = 0, tmp = headers_buf; *tmp && i < cnt;) { |
1560 |
for (i = 0, tmp = headers_buf; *tmp && i < cnt;) { |
1540 |
int real_header = JK_TRUE; |
1561 |
int real_header = JK_TRUE; |
1541 |
|
1562 |
|
1542 |
/* Skipp the HTTP_ prefix to the beginning of th header name */ |
1563 |
/* Skip the HTTP_ prefix to the beginning of the header name */ |
1543 |
tmp += len_of_http_prefix; |
1564 |
tmp += len_of_http_prefix; |
1544 |
|
1565 |
|
1545 |
if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) |
1566 |
if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) |
1546 |
|| !strnicmp(tmp, WORKER_HEADER_NAME, |
1567 |
|| !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME)) ) { |
1547 |
strlen(WORKER_HEADER_NAME))) { |
1568 |
/* Skip redirector headers */ |
|
|
1569 |
real_header = JK_FALSE; |
1570 |
} |
1571 |
if (!strnicmp(tmp, QUERY_HEADER_NAME, strlen(QUERY_HEADER_NAME))) { |
1572 |
/* QUERY was supplied, remove it from the count and skip */ |
1573 |
cnt--; |
1548 |
real_header = JK_FALSE; |
1574 |
real_header = JK_FALSE; |
1549 |
} |
1575 |
} |
1550 |
else if (need_content_length_header && |
1576 |
else if (need_content_length_header && |
1551 |
!strnicmp(tmp, CONTENT_LENGTH, |
1577 |
!strnicmp(tmp, CONTENT_LENGTH_HEADER_NAME, |
1552 |
strlen(CONTENT_LENGTH))) { |
1578 |
CONTENT_LENGTH_HEADER_NAME_LEN)) { |
1553 |
need_content_length_header = FALSE; |
1579 |
need_content_length_header = FALSE; |
1554 |
s->headers_names[i] = tmp; |
1580 |
s->headers_names[i] = tmp; |
1555 |
} |
1581 |
} |
1556 |
else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME, |
1582 |
else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME, |
1557 |
strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { |
1583 |
strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { |
1558 |
tmp += 6; /* TOMCAT */ |
1584 |
s->headers_names[i] = TRANSLATE_HEADER_NAME_LC; |
1559 |
s->headers_names[i] = tmp; |
|
|
1560 |
} |
1585 |
} |
1561 |
else { |
1586 |
else { |
1562 |
s->headers_names[i] = tmp; |
1587 |
s->headers_names[i] = tmp; |
Lines 1574-1580
Link Here
|
1574 |
*tmp = '\0'; |
1599 |
*tmp = '\0'; |
1575 |
tmp++; |
1600 |
tmp++; |
1576 |
|
1601 |
|
1577 |
/* Skip all the WS chars after the ':' to the beginning of th header value */ |
1602 |
/* Skip all the WS chars after the ':' to the beginning of the header value */ |
1578 |
while (' ' == *tmp || '\t' == *tmp || '\v' == *tmp) { |
1603 |
while (' ' == *tmp || '\t' == *tmp || '\v' == *tmp) { |
1579 |
tmp++; |
1604 |
tmp++; |
1580 |
} |
1605 |
} |
Lines 1589-1595
Link Here
|
1589 |
*tmp = '\0'; |
1614 |
*tmp = '\0'; |
1590 |
tmp++; |
1615 |
tmp++; |
1591 |
|
1616 |
|
1592 |
/* skipp CR LF */ |
1617 |
/* skip CR LF */ |
1593 |
while (*tmp == '\n' || *tmp == '\r') { |
1618 |
while (*tmp == '\n' || *tmp == '\r') { |
1594 |
tmp++; |
1619 |
tmp++; |
1595 |
} |
1620 |
} |