View | Details | Raw Unified | Return to bug 35298
Collapse All | Expand All

(-)jk/native/iis/jk_isapi_plugin.c (-29 / +54 lines)
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
                }

Return to bug 35298