nacho 02/04/18 17:20:14 Modified: jk/native2/server/isapi iis.h jk_isapi_plugin.c jk_service_iis.c Log: * Work in progess.. jk_service_iis..c compiles.. i think it's almost done.. Revision Changes Path 1.2 +145 -6 jakarta-tomcat-connectors/jk/native2/server/isapi/iis.h Index: iis.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/iis.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- iis.h 18 Apr 2002 15:03:32 -0000 1.1 +++ iis.h 19 Apr 2002 00:20:13 -0000 1.2 @@ -1,4 +1,63 @@ -//static jk_worker_env_t worker_env; +/* ========================================================================= * + * * + * The Apache Software License, Version 1.1 * + * * + * Copyright (c) 1999-2001 The Apache Software Foundation. * + * All rights reserved. * + * * + * ========================================================================= * + * * + * Redistribution and use in source and binary forms, with or without modi- * + * fication, are permitted provided that the following conditions are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice * + * notice, this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. The end-user documentation included with the redistribution, if any, * + * must include the following acknowlegement: * + * * + * "This product includes software developed by the Apache Software * + * Foundation <http://www.apache.org/>." * + * * + * Alternately, this acknowlegement may appear in the software itself, if * + * and wherever such third-party acknowlegements normally appear. * + * * + * 4. The names "The Jakarta Project", "Jk", and "Apache Software * + * Foundation" must not be used to endorse or promote products derived * + * from this software without prior written permission. For written * + * permission, please contact <[EMAIL PROTECTED]>. * + * * + * 5. Products derived from this software may not be called "Apache" nor may * + * "Apache" appear in their names without prior written permission of the * + * Apache Software Foundation. * + * * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * + * THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY * + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * + * POSSIBILITY OF SUCH DAMAGE. * + * * + * ========================================================================= * + * * + * This software consists of voluntary contributions made by many indivi- * + * duals on behalf of the Apache Software Foundation. For more information * + * on the Apache Software Foundation, please see <http://www.apache.org/>. * + * * + * ========================================================================= */ + +#ifndef IIS_H +#define IIS_H + #define _WIN32_WINNT 0x0400 #include <httpext.h> @@ -9,9 +68,14 @@ //#include "jk_util.h" #include "jk_pool.h" +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + + struct isapi_private_data { - jk_pool_t p; - + jk_pool_t p; int request_started; unsigned bytes_read_so_far; LPEXTENSION_CONTROL_BLOCK lpEcb; @@ -20,12 +84,87 @@ -static int JK_METHOD start_response(jk_env_t *env, jk_ws_service_t *s ); +#define VERSION_STRING "Jakarta/ISAPI/1.2Dev" + +#define DEFAULT_WORKER_NAME ("ajp13") +/* + * We use special headers to pass values from the filter to the + * extension. These values are: + * + * 1. The real URI before redirection took place + * 2. The name of the worker to be used. + * 3. The contents of the Translate header, if any + * + */ +#define URI_HEADER_NAME ("TOMCATURI:") +#define QUERY_HEADER_NAME ("TOMCATQUERY:") +#define WORKER_HEADER_NAME ("TOMCATWORKER:") +#define TOMCAT_TRANSLATE_HEADER_NAME ("TOMCATTRANSLATE:") +#define CONTENT_LENGTH ("CONTENT_LENGTH:") + +#define HTTP_URI_HEADER_NAME ("HTTP_TOMCATURI") +#define HTTP_QUERY_HEADER_NAME ("HTTP_TOMCATQUERY") +#define HTTP_WORKER_HEADER_NAME ("HTTP_TOMCATWORKER") + +#define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.2") +#define EXTENSION_URI_TAG ("extension_uri") + +#define URI_SELECT_TAG ("uri_select") + +#define URI_SELECT_PARSED_VERB ("parsed") +#define URI_SELECT_UNPARSED_VERB ("unparsed") +#define URI_SELECT_ESCAPED_VERB ("escaped") + +#define BAD_REQUEST -1 +#define BAD_PATH -2 +#define MAX_SERVERNAME 128 + + +#define GET_SERVER_VARIABLE_VALUE(name, place) { \ + (place) = NULL; \ + huge_buf_sz = sizeof(huge_buf); \ + if (get_server_value(private_data->lpEcb, \ + (name), \ + huge_buf, \ + huge_buf_sz, \ + "")) { \ + (place) = private_data->p.pstrdup(env,&private_data->p,huge_buf); \ + } \ +}\ + +#define GET_SERVER_VARIABLE_VALUE_INT(name, place, def) { \ + huge_buf_sz = sizeof(huge_buf); \ + if (get_server_value(private_data->lpEcb, \ + (name), \ + huge_buf, \ + huge_buf_sz, \ + "")) { \ + (place) = atoi(huge_buf); \ + if (0 == (place)) { \ + (place) = def; \ + } \ + } else { \ + (place) = def; \ + } \ +}\ -static int JK_METHOD read(jk_env_t *env, jk_ws_service_t *s, + +static int JK_METHOD jk2_service_iis_head(jk_env_t *env, jk_ws_service_t *s ); + +static int JK_METHOD jk2_service_iis_read(jk_env_t *env, jk_ws_service_t *s, void *b, unsigned len, unsigned *actually_read); -static int JK_METHOD write(jk_env_t *env,jk_ws_service_t *s, +static int JK_METHOD jk2_service_iis_write(jk_env_t *env,jk_ws_service_t *s, const void *b, unsigned l); + +static int JK_METHOD jk2_service_iis_init_ws_service( struct jk_env *env, jk_ws_service_t *_this, + struct jk_worker *w, void *serverObj ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif 1.2 +5 -226 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c Index: jk_isapi_plugin.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_isapi_plugin.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- jk_isapi_plugin.c 18 Apr 2002 19:46:31 -0000 1.1 +++ jk_isapi_plugin.c 19 Apr 2002 00:20:13 -0000 1.2 @@ -60,7 +60,7 @@ * Author: Gal Shachor <[EMAIL PROTECTED]> * * Author: Larry Isaacs <[EMAIL PROTECTED]> * * Author: Ignacio J. Ortega <[EMAIL PROTECTED]> * - * Version: $Revision: 1.1 $ * + * Version: $Revision: 1.2 $ * ***************************************************************************/ // This define is needed to include wincrypt,h, needed to get client certificates @@ -83,69 +83,6 @@ #define jk_log(a,b,c) -#define VERSION_STRING "Jakarta/ISAPI/2.0Dev" - -#define DEFAULT_WORKER_NAME ("ajp13") -/* - * We use special headers to pass values from the filter to the - * extension. These values are: - * - * 1. The real URI before redirection took place - * 2. The name of the worker to be used. - * 3. The contents of the Translate header, if any - * - */ -#define URI_HEADER_NAME ("TOMCATURI:") -#define QUERY_HEADER_NAME ("TOMCATQUERY:") -#define WORKER_HEADER_NAME ("TOMCATWORKER:") -#define TOMCAT_TRANSLATE_HEADER_NAME ("TOMCATTRANSLATE:") -#define CONTENT_LENGTH ("CONTENT_LENGTH:") - -#define HTTP_URI_HEADER_NAME ("HTTP_TOMCATURI") -#define HTTP_QUERY_HEADER_NAME ("HTTP_TOMCATQUERY") -#define HTTP_WORKER_HEADER_NAME ("HTTP_TOMCATWORKER") - -#define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.0") -#define EXTENSION_URI_TAG ("extension_uri") - -#define URI_SELECT_TAG ("uri_select") - -#define URI_SELECT_PARSED_VERB ("parsed") -#define URI_SELECT_UNPARSED_VERB ("unparsed") -#define URI_SELECT_ESCAPED_VERB ("escaped") - -#define BAD_REQUEST -1 -#define BAD_PATH -2 -#define MAX_SERVERNAME 128 - - -#define GET_SERVER_VARIABLE_VALUE(name, place) { \ - (place) = NULL; \ - huge_buf_sz = sizeof(huge_buf); \ - if (get_server_value(private_data->lpEcb, \ - (name), \ - huge_buf, \ - huge_buf_sz, \ - "")) { \ - (place) = jk_pool_strdup(&private_data->p, huge_buf); \ - } \ -}\ - -#define GET_SERVER_VARIABLE_VALUE_INT(name, place, def) { \ - huge_buf_sz = sizeof(huge_buf); \ - if (get_server_value(private_data->lpEcb, \ - (name), \ - huge_buf, \ - huge_buf_sz, \ - "")) { \ - (place) = atoi(huge_buf); \ - if (0 == (place)) { \ - (place) = def; \ - } \ - } else { \ - (place) = def; \ - } \ -}\ static char ini_file_name[MAX_PATH]; static int using_ini_file = JK_FALSE; @@ -155,8 +92,6 @@ static jk_workerEnv_t *workerEnv; static jk_logger_t *logger = NULL; -static char *SERVER_NAME = "SERVER_NAME"; -static char *SERVER_SOFTWARE = "SERVER_SOFTWARE"; static char extension_uri[INTERNET_MAX_URL_LENGTH] = "/jakarta/isapi_redirector2.dll"; @@ -202,164 +137,6 @@ int len); -static char x2c(const char *what) -{ - register char digit; - - digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); - digit *= 16; - digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); - return (digit); -} - -static int unescape_url(char *url) -{ - register int x, y, badesc, badpath; - - badesc = 0; - badpath = 0; - for (x = 0, y = 0; url[y]; ++x, ++y) { - if (url[y] != '%') - url[x] = url[y]; - else { - if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) { - badesc = 1; - url[x] = '%'; - } - else { - url[x] = x2c(&url[y + 1]); - y += 2; - if (url[x] == '/' || url[x] == '\0') - badpath = 1; - } - } - } - url[x] = '\0'; - if (badesc) - return BAD_REQUEST; - else if (badpath) - return BAD_PATH; - else - return 0; -} - -static void getparents(char *name) -{ - int l, w; - - /* Four paseses, as per RFC 1808 */ - /* a) remove ./ path segments */ - - for (l = 0, w = 0; name[l] != '\0';) { - if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/')) - l += 2; - else - name[w++] = name[l++]; - } - - /* b) remove trailing . path, segment */ - if (w == 1 && name[0] == '.') - w--; - else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/') - w--; - name[w] = '\0'; - - /* c) remove all xx/../ segments. (including leading ../ and /../) */ - l = 0; - - while (name[l] != '\0') { - if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' && - (l == 0 || name[l - 1] == '/')) { - register int m = l + 3, n; - - l = l - 2; - if (l >= 0) { - while (l >= 0 && name[l] != '/') - l--; - l++; - } - else - l = 0; - n = l; - while ((name[n] = name[m])) - (++n, ++m); - } - else - ++l; - } - - /* d) remove trailing xx/.. segment. */ - if (l == 2 && name[0] == '.' && name[1] == '.') - name[0] = '\0'; - else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') { - l = l - 4; - if (l >= 0) { - while (l >= 0 && name[l] != '/') - l--; - l++; - } - else - l = 0; - name[l] = '\0'; - } -} - -/* Apache code to escape a URL */ - -#define T_OS_ESCAPE_PATH (4) - -static const unsigned char test_char_table[256] = { - 0,14,14,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,0,7,6,1,6,1,1, - 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,8,15, - 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,15,15,15,7,0,7,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,15,7,15,1,14,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 -}; - -#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f)) - -static const char c2x_table[] = "0123456789abcdef"; - -static unsigned char *c2x(unsigned what, unsigned char *where) -{ - *where++ = '%'; - *where++ = c2x_table[what >> 4]; - *where++ = c2x_table[what & 0xf]; - return where; -} - -static int escape_url(const char *path, char *dest, int destsize) -{ - const unsigned char *s = (const unsigned char *)path; - unsigned char *d = (unsigned char *)dest; - unsigned char *e = dest + destsize - 1; - unsigned char *ee = dest + destsize - 3; - unsigned c; - - while ((c = *s)) { - if (TEST_CHAR(c, T_OS_ESCAPE_PATH)) { - if (d >= ee ) - return JK_FALSE; - d = c2x(c, d); - } - else { - if (d >= e ) - return JK_FALSE; - *d++ = c; - } - ++s; - } - *d = '\0'; - return JK_TRUE; -} static int uri_is_web_inf(char *uri) { @@ -1023,7 +800,9 @@ /** Basic initialization for jk2. */ -static void jk2_create_workerEnv(apr_pool_t *p, server_rec *s) { + + +static void jk2_create_workerEnv(apr_pool_t *p /*, server_rec *s*/) { jk_env_t *env; jk_logger_t *l; jk_pool_t *globalPool; @@ -1081,7 +860,7 @@ workerEnv->_private = s; } -static void *jk2_create_config(apr_pool_t *p, server_rec *s) +static void *jk2_create_config(apr_pool_t *p /*, server_rec *s*/) { jk_uriEnv_t *newUri; jk_bean_t *jkb; 1.2 +311 -150 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c Index: jk_service_iis.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- jk_service_iis.c 18 Apr 2002 15:03:32 -0000 1.1 +++ jk_service_iis.c 19 Apr 2002 00:20:13 -0000 1.2 @@ -60,7 +60,7 @@ * Author: Gal Shachor <[EMAIL PROTECTED]> * Henri Gomez <[EMAIL PROTECTED]> * Ignacio J. Ortega <[EMAIL PROTECTED]> - * Version: $Revision: 1.1 $ + * Version: $Revision: 1.2 $ */ // This define is needed to include wincrypt,h, needed to get client certificates @@ -81,7 +81,242 @@ #include "iis.h" //#include "jk_uri_worker_map.h" -#define jk_log(a,b,c) + +static char *SERVER_NAME = "SERVER_NAME"; +static char *SERVER_SOFTWARE = "SERVER_SOFTWARE"; + +static const char begin_cert [] = + "-----BEGIN CERTIFICATE-----\r\n"; + +static const char end_cert [] = + "-----END CERTIFICATE-----\r\n"; + +static const char basis_64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static int base64_encode_cert_len(int len) +{ + int n = ((len + 2) / 3 * 4) + 1; // base64 encoded size + n += (n + 63 / 64) * 2; // add CRLF's + n += sizeof(begin_cert) + sizeof(end_cert) - 2; // add enclosing strings. + return n; +} + +static int base64_encode_cert(char *encoded, + const unsigned char *string, int len) +{ + int i,c; + char *p; + const char *t; + + p = encoded; + + t = begin_cert; + while (*t != '\0') + *p++ = *t++; + + c = 0; + for (i = 0; i < len - 2; i += 3) { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + *p++ = basis_64[((string[i] & 0x3) << 4) | + ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2) | + ((int) (string[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[string[i + 2] & 0x3F]; + c += 4; + if ( c >= 64 ) { + *p++ = '\r'; + *p++ = '\n'; + c = 0; + } + } + if (i < len) { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + if (i == (len - 1)) { + *p++ = basis_64[((string[i] & 0x3) << 4)]; + *p++ = '='; + } + else { + *p++ = basis_64[((string[i] & 0x3) << 4) | + ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; + } + *p++ = '='; + c++; + } + if ( c != 0 ) { + *p++ = '\r'; + *p++ = '\n'; + } + + t = end_cert; + while (*t != '\0') + *p++ = *t++; + + *p++ = '\0'; + return p - encoded; +} + + +static char x2c(const char *what) +{ + register char digit; + + digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); + digit *= 16; + digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); + return (digit); +} + +static int unescape_url(char *url) +{ + register int x, y, badesc, badpath; + + badesc = 0; + badpath = 0; + for (x = 0, y = 0; url[y]; ++x, ++y) { + if (url[y] != '%') + url[x] = url[y]; + else { + if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) { + badesc = 1; + url[x] = '%'; + } + else { + url[x] = x2c(&url[y + 1]); + y += 2; + if (url[x] == '/' || url[x] == '\0') + badpath = 1; + } + } + } + url[x] = '\0'; + if (badesc) + return BAD_REQUEST; + else if (badpath) + return BAD_PATH; + else + return 0; +} + +static void getparents(char *name) +{ + int l, w; + + /* Four paseses, as per RFC 1808 */ + /* a) remove ./ path segments */ + + for (l = 0, w = 0; name[l] != '\0';) { + if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/')) + l += 2; + else + name[w++] = name[l++]; + } + + /* b) remove trailing . path, segment */ + if (w == 1 && name[0] == '.') + w--; + else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/') + w--; + name[w] = '\0'; + + /* c) remove all xx/../ segments. (including leading ../ and /../) */ + l = 0; + + while (name[l] != '\0') { + if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' && + (l == 0 || name[l - 1] == '/')) { + register int m = l + 3, n; + + l = l - 2; + if (l >= 0) { + while (l >= 0 && name[l] != '/') + l--; + l++; + } + else + l = 0; + n = l; + while ((name[n] = name[m])) + (++n, ++m); + } + else + ++l; + } + + /* d) remove trailing xx/.. segment. */ + if (l == 2 && name[0] == '.' && name[1] == '.') + name[0] = '\0'; + else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') { + l = l - 4; + if (l >= 0) { + while (l >= 0 && name[l] != '/') + l--; + l++; + } + else + l = 0; + name[l] = '\0'; + } +} + +/* Apache code to escape a URL */ + +#define T_OS_ESCAPE_PATH (4) + +static const unsigned char test_char_table[256] = { + 0,14,14,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,0,7,6,1,6,1,1, + 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,8,15, + 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,15,15,15,7,0,7,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,15,7,15,1,14,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 +}; + +#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f)) + +static const char c2x_table[] = "0123456789abcdef"; + +static unsigned char *c2x(unsigned what, unsigned char *where) +{ + *where++ = '%'; + *where++ = c2x_table[what >> 4]; + *where++ = c2x_table[what & 0xf]; + return where; +} + +static int escape_url(const char *path, char *dest, int destsize) +{ + const unsigned char *s = (const unsigned char *)path; + unsigned char *d = (unsigned char *)dest; + unsigned char *e = dest + destsize - 1; + unsigned char *ee = dest + destsize - 3; + unsigned c; + + while ((c = *s)) { + if (TEST_CHAR(c, T_OS_ESCAPE_PATH)) { + if (d >= ee ) + return JK_FALSE; + d = c2x(c, d); + } + else { + if (d >= e ) + return JK_FALSE; + *d++ = c; + } + ++s; + } + *d = '\0'; + return JK_TRUE; +} + static void write_error_response(PHTTP_FILTER_CONTEXT pfc,char *status,char * msg) @@ -104,6 +339,7 @@ pfc->WriteClient(pfc, msg, &len, 0); } + static int JK_METHOD jk2_service_iis_head(jk_env_t *env, jk_ws_service_t *s ){ static char crlf[3] = { (char)13, (char)10, '\0' }; char *reason; @@ -112,7 +348,7 @@ if (s->status< 100 || s->status > 1000) { env->l->jkLog(env,env->l, JK_LOG_ERROR, - "jk_ws_service_t::start_response, invalid status %d\n", s->status); + "jk_ws_service_t::jk2_service_iis_head, invalid status %d\n", s->status); return JK_FALSE; } @@ -169,8 +405,8 @@ status_str, (LPDWORD)&len_of_status, (LPDWORD)headers_str)) { - jk_log(logger, JK_LOG_ERROR, - "jk_ws_service_t::start_response, ServerSupportFunction failed\n"); + env->l->jkLog(env,env->l, JK_LOG_ERROR, + "jk_ws_service_t::jk2_service_iis_head, ServerSupportFunction failed\n"); return JK_FALSE; } @@ -180,8 +416,8 @@ } - jk_log(logger, JK_LOG_ERROR, - "jk_ws_service_t::start_response, NULL parameters\n"); + env->l->jkLog(env,env->l, JK_LOG_ERROR, + "jk_ws_service_t::jk2_service_iis_head, NULL parameters\n"); return JK_FALSE; } @@ -191,7 +427,7 @@ unsigned l, unsigned *a) { - jk_log(logger, JK_LOG_DEBUG, + env->l->jkLog(env,env->l, JK_LOG_DEBUG, "Into jk_ws_service_t::read\n"); if (s && s->ws_private && b && a) { @@ -225,7 +461,7 @@ if (p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, &l)) { *a += l; } else { - jk_log(logger, JK_LOG_ERROR, + env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::read, ReadClient failed\n"); return JK_FALSE; } @@ -234,7 +470,7 @@ return JK_TRUE; } - jk_log(logger, JK_LOG_ERROR, + env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::read, NULL parameters\n"); return JK_FALSE; } @@ -243,7 +479,7 @@ const void *b, unsigned l) { - jk_log(logger, JK_LOG_DEBUG, + env->l->jkLog(env,env->l, JK_LOG_DEBUG, "Into jk_ws_service_t::write\n"); if (s && s->ws_private && b) { @@ -254,7 +490,7 @@ char *buf = (char *)b; if (!p->request_started) { - start_response(env, s ); + jk2_service_iis_head(env, s ); } while(written < l) { @@ -263,7 +499,7 @@ buf + written, &try_to_write, 0)) { - jk_log(logger, JK_LOG_ERROR, + env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::write, WriteClient failed\n"); return JK_FALSE; } @@ -275,27 +511,64 @@ } - jk_log(logger, JK_LOG_ERROR, + env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::write, NULL parameters\n"); return JK_FALSE; } -static int init_ws_service(isapi_private_data_t *private_data, - jk_ws_service_t *s, - char **worker_name) +int JK_METHOD jk2_service_iis_init(jk_env_t *env, jk_ws_service_t *s) { - char huge_buf[16 * 1024]; /* should be enough for all */ + if(s==NULL ) { + return JK_FALSE; + } - DWORD huge_buf_sz; + s->head = jk2_service_iis_head; + s->read = jk2_service_iis_read; + s->write = jk2_service_iis_write; + s->init = jk2_service_iis_init_ws_service; + + return JK_TRUE; +} - s->jvm_route = NULL; - s->head = start_response; - s->read = read; - s->write = write; +static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb, + char *name, + char *buf, + DWORD bufsz, + char *def_val) +{ + if (!lpEcb->GetServerVariable(lpEcb->ConnID, + name, + buf, + (LPDWORD)&bufsz)) { + strcpy(buf, def_val); + return JK_FALSE; + } + + if (bufsz > 0) { + buf[bufsz - 1] = '\0'; + } + + return JK_TRUE; +} + +static int JK_METHOD jk2_service_iis_init_ws_service( struct jk_env *env, jk_ws_service_t *s, + struct jk_worker *w, void *serverObj ) + +/* */ + +{ + isapi_private_data_t *private_data=serverObj; + char huge_buf[16 * 1024]; /* should be enough for all */ + char **worker_name; + + DWORD huge_buf_sz; + + s->jvm_route = NULL; + GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name)); GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri); GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string); @@ -328,7 +601,7 @@ s->ssl_session = NULL; s->ssl_key_size = -1; - s->headers_in = NULL; + jk2_map_default_create(env, &s->headers_in, s->pool ); // s->headers_values = NULL; // s->num_headers = 0; @@ -370,20 +643,15 @@ if (num_of_vars) { unsigned j; - s->attributes=NULL; - _names = - jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *)); - s->attributes_values = - jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *)); + jk2_map_default_create(env, &s->attributes, s->pool ); + j = 0; for(i = 0 ; i < 9 ; i++) { if (ssl_env_values[i]) { - s->attributes_names[j] = ssl_env_names[i]; - s->attributes_values[j] = ssl_env_values[i]; + s->attributes->put(env,s->attributes,ssl_env_names[i],ssl_env_values[i],NULL); j++; } } - s->num_attributes = num_of_vars; if (ssl_env_values[4] && ssl_env_values[4][0] == '1') { CERT_CONTEXT_EX cc; DWORD cc_sz = sizeof(cc); @@ -395,11 +663,11 @@ (DWORD)HSE_REQ_GET_CERT_INFO_EX, (LPVOID)&cc,NULL,NULL) != FALSE) { - jk_log(logger, JK_LOG_DEBUG,"Client Certificate encoding:%d sz:%d flags:%ld\n", + env->l->jkLog(env,env->l, JK_LOG_DEBUG,"Client Certificate encoding:%d sz:%d flags:%ld\n", cc.CertContext.dwCertEncodingType & X509_ASN_ENCODING , cc.CertContext.cbCertEncoded, cc.dwCertificateFlags); - s->ssl_cert=jk_pool_alloc(&private_data->p, + s->ssl_cert=private_data->p.alloc(env,&private_data->p, base64_encode_cert_len(cc.CertContext.cbCertEncoded)); s->ssl_cert_len = base64_encode_cert(s->ssl_cert, @@ -409,7 +677,6 @@ } } -*/ huge_buf_sz = sizeof(huge_buf); if (get_server_value(private_data->lpEcb, "ALL_HTTP", @@ -426,13 +693,14 @@ } if (cnt) { - char *headers_buf = jk_pool_strdup(&private_data->p, huge_buf); + char *headers_buf = private_data->p.pstrdup(env,&private_data->p, huge_buf); unsigned i; unsigned len_of_http_prefix = strlen("HTTP_"); BOOL need_content_length_header = (s->content_length == 0); cnt -= 2; /* For our two special headers */ /* allocate an extra header slot in case we need to add a content-length header */ +/* s->headers_names = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); s->headers_values = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); @@ -440,8 +708,10 @@ return JK_FALSE; } + */ for(i = 0, tmp = headers_buf ; *tmp && i < cnt ; ) { int real_header = JK_TRUE; + char *name; /* Skipp the HTTP_ prefix to the beginning of th header name */ tmp += len_of_http_prefix; @@ -452,13 +722,13 @@ } else if(need_content_length_header && !strnicmp(tmp, CONTENT_LENGTH, strlen(CONTENT_LENGTH))) { need_content_length_header = FALSE; - s->headers_names[i] = tmp; + name = tmp; } else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME, strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { tmp += 6; /* TOMCAT */ - s->headers_names[i] = tmp; + name = tmp; } else { - s->headers_names[i] = tmp; + name = tmp; } while(':' != *tmp && *tmp) { @@ -478,7 +748,7 @@ } if (real_header) { - s->headers_values[i] = tmp; + s->headers_in->put(env,s->headers_in,name,tmp,NULL); } while(*tmp != '\n' && *tmp != '\r') { @@ -501,11 +771,9 @@ * but non-zero length body. */ if(need_content_length_header) { - s->headers_names[cnt] = "content-length"; - s->headers_values[cnt] = "0"; + s->headers_in->put(env,s->headers_in,"content-length","0",NULL); cnt++; } - s->num_headers = cnt; } else { /* We must have our two headers */ return JK_FALSE; @@ -517,111 +785,4 @@ return JK_TRUE; } -static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb, - char *name, - char *buf, - DWORD bufsz, - char *def_val) -{ - if (!lpEcb->GetServerVariable(lpEcb->ConnID, - name, - buf, - (LPDWORD)&bufsz)) { - strcpy(buf, def_val); - return JK_FALSE; - } - - if (bufsz > 0) { - buf[bufsz - 1] = '\0'; - } - - return JK_TRUE; -} - -static const char begin_cert [] = - "-----BEGIN CERTIFICATE-----\r\n"; - -static const char end_cert [] = - "-----END CERTIFICATE-----\r\n"; - -static const char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static int base64_encode_cert_len(int len) -{ - int n = ((len + 2) / 3 * 4) + 1; // base64 encoded size - n += (n + 63 / 64) * 2; // add CRLF's - n += sizeof(begin_cert) + sizeof(end_cert) - 2; // add enclosing strings. - return n; -} - -static int base64_encode_cert(char *encoded, - const unsigned char *string, int len) -{ - int i,c; - char *p; - const char *t; - - p = encoded; - - t = begin_cert; - while (*t != '\0') - *p++ = *t++; - - c = 0; - for (i = 0; i < len - 2; i += 3) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2) | - ((int) (string[i + 2] & 0xC0) >> 6)]; - *p++ = basis_64[string[i + 2] & 0x3F]; - c += 4; - if ( c >= 64 ) { - *p++ = '\r'; - *p++ = '\n'; - c = 0; - } - } - if (i < len) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - if (i == (len - 1)) { - *p++ = basis_64[((string[i] & 0x3) << 4)]; - *p++ = '='; - } - else { - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; - } - *p++ = '='; - c++; - } - if ( c != 0 ) { - *p++ = '\r'; - *p++ = '\n'; - } - - t = end_cert; - while (*t != '\0') - *p++ = *t++; - - *p++ = '\0'; - return p - encoded; -} - -int jk2_service_iis_init(jk_env_t *env, jk_ws_service_t *s) -{ - if(s==NULL ) { - return JK_FALSE; - } - - s->head = jk2_service_iis_head; - s->read = jk2_service_iis_read; - s->write = jk2_service_iis_write; - s->init = jk2_init_ws_service; - s->afterRequest = jk2_service_apache2_afterRequest; - - return JK_TRUE; -}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>