Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@apache.org Received: (qmail 16027 invoked from network); 18 Apr 2002 18:38:50 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 18 Apr 2002 18:38:50 -0000 Received: (qmail 28640 invoked by uid 97); 18 Apr 2002 18:37:22 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-dev@jakarta.apache.org Received: (qmail 28517 invoked by uid 97); 18 Apr 2002 18:37:22 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 28422 invoked by uid 97); 18 Apr 2002 18:37:21 -0000 Message-ID: <80F5674514B4D311BAFC0040F6A45EEE28C43C@ntserver> From: "Ignacio J. Ortega" To: 'Tomcat Developers List' , "'jakarta-tomcat-connectors-cvs@apache.org'" Subject: RE: cvs commit: jakarta-tomcat-connectors/jk/native2/server/isapi iis.h isapi.dsp jk2_isapi_plugin.c jk_service_iis.c Date: Thu, 18 Apr 2002 20:37:17 +0200 X-Priority: 3 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.0.1457.3) Content-Type: text/plain; charset="iso-8859-1" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Doh sorry, but the jk2_isapi_plugin.c file is only a copy of mod_jk2.., I'm about to remove it, and commit the correct one.. that does not work at all nor compile, but it's really the work in progress i've mentioned.. Saludos , Ignacio J. Ortega > -----Mensaje original----- > De: nacho@apache.org [mailto:nacho@apache.org] > Enviado el: jueves 18 de abril de 2002 17:04 > Para: jakarta-tomcat-connectors-cvs@apache.org > Asunto: cvs commit: jakarta-tomcat-connectors/jk/native2/server/isapi > iis.h isapi.dsp jk2_isapi_plugin.c jk_service_iis.c > > > nacho 02/04/18 08:03:32 > > Added: jk/native2/server/isapi iis.h isapi.dsp > jk2_isapi_plugin.c > jk_service_iis.c > Log: > * Initial commit for jk2 isapi plugin, mostly broken and > doesnt compile. > > Revision Changes Path > 1.1 > jakarta-tomcat-connectors/jk/native2/server/isapi/iis.h > > Index: iis.h > =================================================================== > //static jk_worker_env_t worker_env; > #define _WIN32_WINNT 0x0400 > > #include > #include > #include > > #include "jk_global.h" > //#include "jk_util.h" > #include "jk_pool.h" > > struct isapi_private_data { > jk_pool_t p; > > int request_started; > unsigned bytes_read_so_far; > LPEXTENSION_CONTROL_BLOCK lpEcb; > }; > typedef struct isapi_private_data isapi_private_data_t; > > > > static int JK_METHOD start_response(jk_env_t *env, > jk_ws_service_t *s ); > > static int JK_METHOD 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, > const void *b, > unsigned l); > > > > 1.1 > jakarta-tomcat-connectors/jk/native2/server/isapi/isapi.dsp > > Index: isapi.dsp > =================================================================== > # Microsoft Developer Studio Project File - Name="isapi" - > Package Owner=<4> > # Microsoft Developer Studio Generated Build File, Format > Version 6.00 > # ** DO NOT EDIT ** > > # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 > > CFG=isapi - Win32 Debug > !MESSAGE This is not a valid makefile. To build this > project using NMAKE, > !MESSAGE use the Export Makefile command and run > !MESSAGE > !MESSAGE NMAKE /f "isapi.mak". > !MESSAGE > !MESSAGE You can specify a configuration when running NMAKE > !MESSAGE by defining the macro CFG on the command line. For example: > !MESSAGE > !MESSAGE NMAKE /f "isapi.mak" CFG="isapi - Win32 Debug" > !MESSAGE > !MESSAGE Possible choices for configuration are: > !MESSAGE > !MESSAGE "isapi - Win32 Release" (based on "Win32 (x86) > Dynamic-Link Library") > !MESSAGE "isapi - Win32 Debug" (based on "Win32 (x86) > Dynamic-Link Library") > !MESSAGE > > # Begin Project > # PROP AllowPerConfigDependencies 0 > # PROP Scc_ProjName "" > # PROP Scc_LocalPath "" > CPP=cl.exe > MTL=midl.exe > RSC=rc.exe > > !IF "$(CFG)" == "isapi - Win32 Release" > > # PROP BASE Use_MFC 0 > # PROP BASE Use_Debug_Libraries 0 > # PROP BASE Output_Dir "Release" > # PROP BASE Intermediate_Dir "Release" > # PROP BASE Target_Dir "" > # PROP Use_MFC 0 > # PROP Use_Debug_Libraries 0 > # PROP Output_Dir "Release" > # PROP Intermediate_Dir "Release" > # PROP Ignore_Export_Lib 0 > # PROP Target_Dir "" > # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D > "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D > "ISAPI_EXPORTS" /YX /FD /c > # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D > "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ISAPI_EXPORTS" /YX /FD /c > # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 > # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 > # ADD BASE RSC /l 0xc0a /d "NDEBUG" > # ADD RSC /l 0xc0a /d "NDEBUG" > BSC32=bscmake.exe > # ADD BASE BSC32 /nologo > # ADD BSC32 /nologo > LINK32=link.exe > # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib > winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib > oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll > /machine:I386 > # ADD LINK32 libapr.lib libaprutil.lib kernel32.lib > user32.lib advapi32.lib wsock32.lib /nologo /dll > /machine:I386 /out:"Release/isapi_redirector2.dll" > > !ELSEIF "$(CFG)" == "isapi - Win32 Debug" > > # PROP BASE Use_MFC 0 > # PROP BASE Use_Debug_Libraries 1 > # PROP BASE Output_Dir "Debug" > # PROP BASE Intermediate_Dir "Debug" > # PROP BASE Target_Dir "" > # PROP Use_MFC 0 > # PROP Use_Debug_Libraries 1 > # PROP Output_Dir "Debug" > # PROP Intermediate_Dir "Debug" > # PROP Ignore_Export_Lib 0 > # PROP Target_Dir "" > # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" > /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D > "ISAPI_EXPORTS" /YX /FD /GZ /c > # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I > "..\..\include" /I "$(JAVA_HOME)\include" /I > "$(JAVA_HOME)\include\win32" /I "$(APACHE20_HOME)\include" /I > "$(APR_HOME)\apr\include" /I "$(APR_HOME)\apr-util\include" > /I "$(APACHE20_HOME)\os\win32" /D "WIN32" /D "_DEBUG" /D > "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ISAPI_EXPORTS" /FR /YX > /FD /GZ /c > # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 > # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 > # ADD BASE RSC /l 0xc0a /d "_DEBUG" > # ADD RSC /l 0xc0a /d "_DEBUG" > BSC32=bscmake.exe > # ADD BASE BSC32 /nologo > # ADD BSC32 /nologo > LINK32=link.exe > # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib > winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib > oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll > /debug /machine:I386 /pdbtype:sept > # ADD LINK32 libapr.lib libaprutil.lib kernel32.lib > user32.lib advapi32.lib wsock32.lib /nologo /dll /debug > /machine:I386 /out:"Debug/isapi_redirector2.dll" > /pdbtype:sept /libpath:"$(APACHE20_HOME)\Release" > /libpath:"$(APR_HOME)\apr\Release" /libpath:"$(APR_HOME)\apr-util\Release" > > !ENDIF > > # Begin Target > > # Name "isapi - Win32 Release" > # Name "isapi - Win32 Debug" > # Begin Group "Source Files" > > # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" > # Begin Source File > > SOURCE=..\..\common\jk_channel_apr_socket.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_channel_socket.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_config.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_endpoint.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_env.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_handler_logon.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_handler_response.c > # End Source File > # Begin Source File > > SOURCE=.\jk_isapi_plugin.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_logger_file.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_map.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_md5.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_msg_ajp.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_nwmain.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_objCache.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_pool.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_pool_apr.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_registry.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_registry.h > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_requtil.c > # End Source File > # Begin Source File > > SOURCE=.\jk_service_iis.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_shm.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_uriEnv.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_uriMap.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_vm_default.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_worker_ajp13.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_worker_jni.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_worker_lb.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_worker_run.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_worker_status.c > # End Source File > # Begin Source File > > SOURCE=..\..\common\jk_workerEnv.c > # End Source File > # End Group > # Begin Group "Header Files" > > # PROP Default_Filter "h;hpp;hxx;hm;inl" > # Begin Source File > > SOURCE=.\iis.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_channel.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_config.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_endpoint.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_env.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_global.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_handler.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_logger.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_map.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_md5.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_msg.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_mt.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_objCache.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_pool.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_requtil.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_service.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_shm.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_uriEnv.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_uriMap.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_vm.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_worker.h > # End Source File > # Begin Source File > > SOURCE=..\..\include\jk_workerEnv.h > # End Source File > # End Group > # Begin Group "Resource Files" > > # PROP Default_Filter > "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" > # End Group > # End Target > # End Project > > > > 1.1 > jakarta-tomcat-connectors/jk/native2/server/isapi/jk2_isapi_plugin.c > > Index: jk2_isapi_plugin.c > =================================================================== > /* > ============================================================== > =========== * > * > * > * 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 ." > * > * > * > * 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 . > * > * > * > * 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 > . * > * > * > * > ============================================================== > =========== */ > > > /************************************************************* > ************** > * Description: Apache 2 plugin for Jakarta/Tomcat > * > * Author: Gal Shachor > * > * Henri Gomez > * > * Version: $Revision: 1.1 $ > * > > ************************************************************** > *************/ > > /* > * mod_jk: keeps all servlet/jakarta related ramblings together. > */ > #include "apu_compat.h" > #include "ap_config.h" > #include "apr_lib.h" > #include "apr_date.h" > #include "apr_strings.h" > > #include "httpd.h" > #include "http_config.h" > #include "http_request.h" > #include "http_core.h" > #include "http_protocol.h" > #include "http_main.h" > #include "http_log.h" > > #include "util_script.h" > > /* > * Jakarta (jk_) include files > */ > #include "jk_global.h" > #include "jk_map.h" > #include "jk_pool.h" > #include "jk_env.h" > #include "jk_service.h" > #include "jk_worker.h" > #include "jk_workerEnv.h" > #include "jk_uriMap.h" > #include "jk_requtil.h" > > #include "jk_apache2.h" > > #define JK_HANDLER ("jakarta-servlet2") > #define JK_MAGIC_TYPE ("application/x-jakarta-servlet2") > > module AP_MODULE_DECLARE_DATA jk2_module; > > /* In apache1.3 this is reset when the module is reloaded ( after > * config. No good way to discover if it's the first time or not. > */ > static jk_workerEnv_t *workerEnv; > > > /* ==================== Options setters ==================== */ > > /* > * The JK2 module command processors. The options can be specified > * in a properties file or in httpd.conf, depending on user's taste. > * > * There is absolutely no difference from the point of view of jk, > * but apache config tools might prefer httpd.conf and the extra > * information included in the command descriptor. It also have > * a 'natural' feel, and is consistent with all other apache > * settings and modules. > * > * Properties file are easier to parse/generate from java, and > * allow identical configuration for all servers. We should have > * code to generate the properties file or use the wire protocol, > * and make all those properties part of server.xml or jk's > * java-side configuration. This will give a 'natural' feel for > * those comfortable with the java side. > * > * The only exception is webapp definition, where in the near > * future you can expect a scalability difference between the > * 2 choices. If you have a large number of apps/vhosts you > * _should_ use the apache style, that makes use of the > * internal apache mapper ( known to scale to very large number > * of hosts ). The internal jk mapper uses linear search, ( will > * eventually use hash tables, when we add support for apr_hash ), > * and is nowhere near the apache mapper. > */ > > /* > * JkSet name value > * > * Set jk options. Same as using workers.properties. > * Common properties: see workers.properties documentation > */ > static const char *jk2_set2(cmd_parms *cmd,void *per_dir, > const char *name, char *value) > { > server_rec *s = cmd->server; > jk_uriEnv_t *serverEnv=(jk_uriEnv_t *) > ap_get_module_config(s->module_config, &jk2_module); > jk_env_t *env=workerEnv->globalEnv; > int rc; > > rc=workerEnv->config->setPropertyString( env, > workerEnv->config, name, value ); > if( rc!=JK_TRUE ) { > fprintf( stderr, "mod_jk2: Unrecognized option %s > %s\n", name, value); > } > > return NULL; > } > > /** > * Set a property associated with a URI, using native > * directives. > * > * This is used if you want to use the native mapping and > * integrate better into apache. > * > * Same behavior can be achieved by using uri.properties > and/or JkSet. > * > * Example: > * > * > * JkUriSet worker ajp13 > * > * > * > * This is the best way to define a webapplication in apache. It is > * scalable ( using apache native optimizations, you can > have hundreds > * of hosts and thousands of webapplications ), 'natural' to any > * apache user. > * > * XXX This is a special configuration, for most users just use > * the properties files. > */ > static const char *jk2_uriSet(cmd_parms *cmd, void *per_dir, > const char *name, const char *val) > { > jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir; > > uriEnv->mbean->setAttribute( workerEnv->globalEnv, > uriEnv->mbean, name, val ); > > fprintf(stderr, "JkUriSet %s %s dir=%s args=%s\n", > uriEnv->workerName, cmd->path, > cmd->directive->directive, > cmd->directive->args); > > return NULL; > } > > /* Command table. > */ > static const command_rec jk2_cmds[] = > { > /* This is the 'main' directive for tunning jk2. It > takes 2 parameters, > and it behaves _identically_ as a setting in > workers.properties. > */ > AP_INIT_TAKE2( > "JkSet", jk2_set2, NULL, RSRC_CONF, > "Set a jk property, same syntax and rules as in > JkWorkersFile"), > AP_INIT_TAKE2( > "JkUriSet", jk2_uriSet, NULL, ACCESS_CONF, > "Defines a jk property associated with a Location"), > NULL > }; > > static void *jk2_create_dir_config(apr_pool_t *p, char *path) > { > /* We don't know the vhost yet - so path is not > * unique. We'll have to generate a unique name > */ > jk_bean_t *jkb=workerEnv->globalEnv->createBean2( > workerEnv->globalEnv, > > workerEnv->pool, "uri", path ); > jk_uriEnv_t *newUri = jkb->object; > newUri->workerEnv=workerEnv; > newUri->mbean->setAttribute( workerEnv->globalEnv, > newUri->mbean, "path", path ); > return newUri; > } > > > static void *jk2_merge_dir_config(apr_pool_t *p, void > *basev, void *addv) > { > jk_uriEnv_t *base =(jk_uriEnv_t *)basev; > jk_uriEnv_t *add = (jk_uriEnv_t *)addv; > jk_uriEnv_t *new = (jk_uriEnv_t > *)apr_pcalloc(p,sizeof(jk_uriEnv_t)); > > > /* XXX */ > fprintf(stderr, "XXX Merged dir config %p %p %s %s %p %p\n", > base, new, base->uri, add->uri, base->webapp, > add->webapp); > > if( add->webapp == NULL ) { > add->webapp=base->webapp; > } > > return add; > } > > /** Basic initialization for jk2. > */ > static void jk2_create_workerEnv(apr_pool_t *p, server_rec *s) { > jk_env_t *env; > jk_logger_t *l; > jk_pool_t *globalPool; > jk_bean_t *jkb; > > /** First create a pool. Compile time option > */ > #ifdef NO_APACHE_POOL > jk2_pool_create( NULL, &globalPool, NULL, 2048 ); > #else > jk2_pool_apr_create( NULL, &globalPool, NULL, p ); > #endif > > /** Create the global environment. This will register > the default > factories > */ > env=jk2_env_getEnv( NULL, globalPool ); > > /* Optional. Register more factories ( or replace > existing ones ) */ > /* Init the environment. */ > > /* Create the logger */ > #ifdef NO_APACHE_LOGGER > jkb=env->createBean2( env, env->globalPool, "logger.file", ""); > env->alias( env, "logger.file:", "logger"); > l = jkb->object; > #else > env->registerFactory( env, "logger.apache2", > jk2_logger_apache2_factory ); > jkb=env->createBean2( env, env->globalPool, > "logger.apache2", ""); > env->alias( env, "logger.apache2:", "logger"); > l = jkb->object; > l->logger_private=s; > #endif > > env->l=l; > > /* We should make it relative to JK_HOME or absolute path. > ap_server_root_relative(cmd->pool,opt); */ > > /* Create the workerEnv */ > jkb=env->createBean2( env, env->globalPool,"workerEnv", ""); > workerEnv= jkb->object; > env->alias( env, "workerEnv:" , "workerEnv"); > > if( workerEnv==NULL ) { > env->l->jkLog(env, env->l, JK_LOG_ERROR, "Error > creating workerEnv\n"); > return; > } > > workerEnv->initData->add( env, workerEnv->initData, > "serverRoot", > workerEnv->pool->pstrdup( > env, workerEnv->pool, ap_server_root)); > env->l->jkLog(env, env->l, JK_LOG_ERROR, "Set > serverRoot %s\n", ap_server_root); > > /* Local initialization */ > workerEnv->_private = s; > } > > /** Create default jk_config. XXX This is mostly server-independent, > all servers are using something similar - should go to common. > > This is the first thing called ( or should be ) > */ > static void *jk2_create_config(apr_pool_t *p, server_rec *s) > { > jk_uriEnv_t *newUri; > jk_bean_t *jkb; > > if( workerEnv==NULL ) { > jk2_create_workerEnv(p, s ); > } > if( s->is_virtual == 1 ) { > /* Virtual host */ > fprintf( stderr, "Create config for virtual host\n"); > } else { > /* Default host */ > fprintf( stderr, "Create config for main host\n"); > } > > jkb = workerEnv->globalEnv->createBean2( workerEnv->globalEnv, > workerEnv->pool, > "uri", NULL ); > newUri=jkb->object; > > newUri->workerEnv=workerEnv; > > return newUri; > } > > > > /** Standard apache callback, merge jk options specified in > context. Used to set per virtual host configs > */ > static void *jk2_merge_config(apr_pool_t *p, > void *basev, > void *overridesv) > { > jk_uriEnv_t *base = (jk_uriEnv_t *) basev; > jk_uriEnv_t *overrides = (jk_uriEnv_t *)overridesv; > > fprintf(stderr, "Merging workerEnv \n" ); > > /* The 'mountcopy' option should be implemented in common. > */ > return overrides; > } > > > /** Standard apache callback, initialize jk. > */ > static void jk2_child_init(apr_pool_t *pconf, > server_rec *s) > { > jk_uriEnv_t *serverEnv=(jk_uriEnv_t *) > ap_get_module_config(s->module_config, &jk2_module); > jk_env_t *env; > > if( workerEnv==NULL ) > workerEnv = serverEnv->workerEnv; > > env=workerEnv->globalEnv; > > env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk child init\n" ); > > /* jk2_init( pconf, conf, s ); > do we need jk2_child_init? For ajp14? */ > } > > /** Initialize jk, using worker.properties. > We also use apache commands ( JkWorker, etc), but this use is > deprecated, as we'll try to concentrate all config in > workers.properties, urimap.properties, and ajp14 autoconf. > > Apache config will only be used for manual override, using > SetHandler and normal apache directives ( but minimal > jk-specific > stuff ) > */ > static char * jk2_init(jk_env_t *env, apr_pool_t *pconf, > jk_workerEnv_t *workerEnv, server_rec *s ) > { > workerEnv->init(env, workerEnv ); > workerEnv->server_name = (char *)ap_get_server_version(); > ap_add_version_component(pconf, JK_EXPOSED_VERSION); > return NULL; > } > > /* Apache will first validate the config then restart. > That will unload all .so modules - including ourself. > Keeping 'was_initialized' in workerEnv is pointless, since both > will disapear. > */ > static int jk2_apache2_isValidating(apr_pool_t *gPool, > apr_pool_t **mainPool) { > apr_pool_t *tmpPool=NULL; > void *data=NULL; > int i; > > for( i=0; i<10; i++ ) { > tmpPool=apr_pool_get_parent( gPool ); > if( tmpPool == NULL ) { > break; > } > gPool=tmpPool; > } > > if( tmpPool == NULL ) { > /* We can't detect the root pool */ > return JK_FALSE; > } > if(mainPool != NULL ) > *mainPool=gPool; > > /* We have a global pool ! */ > apr_pool_userdata_get( &data, "mod_jk_init", gPool ); > if( data==NULL ) { > return JK_TRUE; > } else { > return JK_FALSE; > } > } > > static int jk2_post_config(apr_pool_t *pconf, > apr_pool_t *plog, > apr_pool_t *ptemp, > server_rec *s) > { > apr_pool_t *gPool=NULL; > void *data=NULL; > int rc; > jk_env_t *env; > > if(s->is_virtual) > return OK; > > env=workerEnv->globalEnv; > > rc=jk2_apache2_isValidating( plog, &gPool ); > > if( rc == JK_TRUE ) { > /* This is the first step */ > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.post_config() first invocation\n"); > apr_pool_userdata_set( "INITOK", "mod_jk_init", > NULL, gPool ); > return OK; > } > > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.post_config() second invocation\n" ); > > if(!workerEnv->was_initialized) { > workerEnv->was_initialized = JK_TRUE; > jk2_init( env, pconf, workerEnv, s ); > } > return OK; > } > > /* > ============================================================== > =========== */ > /* The JK module handlers > */ > /* > ============================================================== > =========== */ > > /** Main service method, called to forward a request to tomcat > */ > static int jk2_handler(request_rec *r) > { > const char *worker_name; > jk_logger_t *l=NULL; > int rc; > jk_worker_t *worker=NULL; > jk_endpoint_t *end = NULL; > jk_uriEnv_t *uriEnv; > jk_uriEnv_t *dirEnv; > jk_env_t *env; > jk_workerEnv_t *workerEnv; > > uriEnv=ap_get_module_config( r->request_config, &jk2_module ); > > /* not for me, try next handler */ > if(uriEnv==NULL || strcmp(r->handler,JK_HANDLER)!= 0 ) > return DECLINED; > > /* If this is a proxy request, we'll notify an error */ > if(r->proxyreq) { > return HTTP_INTERNAL_SERVER_ERROR; > } > > workerEnv = uriEnv->workerEnv; > > /* Get an env instance */ > env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv ); > > /* Set up r->read_chunked flags for chunked encoding, > if present */ > if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) { > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.handler() Can't setup client > block %d\n", rc); > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return rc; > } > > if( uriEnv == NULL ) { > /* SetHandler case - per_dir config should have the worker*/ > worker = workerEnv->defaultWorker; > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.handler() Default worker for %s %s\n", > r->uri, worker->mbean->name); > } else { > worker=uriEnv->worker; > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.handler() per dir worker for %p %p\n", > worker, uriEnv->webapp ); > > if( worker==NULL && uriEnv->workerName != NULL ) { > worker=env->getByName( env, uriEnv->workerName); > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.handler() finding worker > for %p %p\n", > worker, uriEnv ); > uriEnv->worker=worker; > } > } > > if(worker==NULL ) { > env->l->jkLog(env, env->l, JK_LOG_ERROR, > "mod_jk.handle() No worker for %s\n", > r->uri); > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return 500; > } > > { > jk_ws_service_t sOnStack; > jk_ws_service_t *s=&sOnStack; > jk_pool_t *rPool=NULL; > int rc1; > > /* Get a pool for the request XXX move it in workerEnv to > be shared with other server adapters */ > rPool= worker->rPoolCache->get( env, worker->rPoolCache ); > if( rPool == NULL ) { > rPool=worker->pool->create( env, worker->pool, > HUGE_POOL_SIZE ); > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.handler(): new rpool\n"); > } > > /* XXX we should reuse the request itself !!! */ > jk2_service_apache2_init( env, s ); > > s->pool = rPool; > > s->is_recoverable_error = JK_FALSE; > s->init( env, s, worker, r ); > > env->l->jkLog(env, env->l, JK_LOG_INFO, > "modjk.handler() Calling %s\n", > worker->mbean->name); > rc = worker->service(env, worker, s); > > s->afterRequest(env, s); > > rPool->reset(env, rPool); > > rc1=worker->rPoolCache->put( env, > worker->rPoolCache, rPool ); > if( rc1 == JK_TRUE ) { > rPool=NULL; > } > if( rPool!=NULL ) { > rPool->close(env, rPool); > } > } > > if(rc==JK_TRUE) { > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return OK; /* NOT r->status, even if it has changed. */ > } > > env->l->jkLog(env, env->l, JK_LOG_ERROR, > "mod_jk.handler() Error connecting to > tomcat %d\n", rc); > workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env ); > return 500; > } > > /** Use the internal mod_jk mappings to find if this is a > request for > * tomcat and what worker to use. > */ > static int jk2_translate(request_rec *r) > { > jk_workerEnv_t *workerEnv; > jk_uriEnv_t *uriEnv; > jk_env_t *env; > > if(r->proxyreq) { > return DECLINED; > } > > uriEnv=ap_get_module_config( r->per_dir_config, &jk2_module ); > workerEnv=uriEnv->workerEnv; > > /* get_env() */ > env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv ); > > /* This has been mapped to a location by apache > * In a previous ( experimental ) version we had a sub-map, > * but that's too complex for now. > */ > if( uriEnv!= NULL && uriEnv->workerName != NULL) { > env->l->jkLog(env, env->l, JK_LOG_INFO, > "PerDir mapping %s=%s\n", > r->uri, uriEnv->workerName); > > ap_set_module_config( r->request_config, > &jk2_module, uriEnv ); > r->handler=JK_HANDLER; > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return OK; > } > > /* One idea was to use "SetHandler jakarta-servlet". > This doesn't > allow the setting of the worker. Having a specific > SetWorker directive > at location level is more powerfull. If anyone can > figure any reson > to support SetHandler, we can add it back easily */ > > /* Check JkMount directives, if any */ > if( workerEnv->uriMap->size == 0 ) { > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return DECLINED; > } > > /* XXX TODO: Split mapping, similar with tomcat. First step will > be a quick test ( the context mapper ), with no allocations. > If positive, we'll fill a ws_service_t and do the rewrite and > the real mapping. > */ > uriEnv = workerEnv->uriMap->mapUri(env, > workerEnv->uriMap,NULL,r->uri ); > > if( uriEnv== NULL || uriEnv->workerName == NULL) { > workerEnv->globalEnv->releaseEnv( > workerEnv->globalEnv, env ); > return DECLINED; > } > > ap_set_module_config( r->request_config, &jk2_module, uriEnv ); > r->handler=JK_HANDLER; > > env->l->jkLog(env, env->l, JK_LOG_INFO, > "mod_jk.translate(): uriMap %s %s\n", > r->uri, uriEnv->workerName); > > workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env ); > return OK; > } > > /* XXX Can we use type checker step to set our stuff ? */ > > /* bypass the directory_walk and file_walk for non-file requests */ > static int jk2_map_to_storage(request_rec *r) > { > jk_uriEnv_t *uriEnv=ap_get_module_config( > r->request_config, &jk2_module ); > > if( uriEnv != NULL ) { > r->filename = (char *)apr_filename_of_pathname(r->uri); > if( uriEnv->debug > 0 ) { > /* env->l->jkLog(env, env->l, JK_LOG_INFO, */ > /* "mod_jk.map_to_storage(): map %s %s\n", */ > /* r->uri, r->filename); */ > } > return OK; > } > return DECLINED; > } > > static void jk2_register_hooks(apr_pool_t *p) > { > ap_hook_handler(jk2_handler, NULL, NULL, APR_HOOK_MIDDLE); > ap_hook_post_config(jk2_post_config,NULL,NULL,APR_HOOK_MIDDLE); > ap_hook_child_init(jk2_child_init,NULL,NULL,APR_HOOK_MIDDLE); > ap_hook_translate_name(jk2_translate,NULL,NULL,APR_HOOK_FIRST); > ap_hook_map_to_storage(jk2_map_to_storage, NULL, NULL, > APR_HOOK_MIDDLE); > } > > module AP_MODULE_DECLARE_DATA jk2_module = > { > STANDARD20_MODULE_STUFF, > jk2_create_dir_config, /* dir config creater */ > jk2_merge_dir_config, /* dir merger --- default is to > override */ > jk2_create_config, /* server config */ > jk2_merge_config, /* merge server config */ > jk2_cmds, /* command ap_table_t */ > jk2_register_hooks /* register hooks */ > }; > > > > > 1.1 > jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c > > Index: jk_service_iis.c > =================================================================== > /* > ============================================================== > =========== * > * > * > * 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 ." > * > * > * > * 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 . > * > * > * > * 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 > . * > * > * > * > ============================================================== > =========== */ > > /** > * Description: IIS Jk2 Service > * Author: Gal Shachor > > * Henri Gomez > * Ignacio J. Ortega > * Version: $Revision: 1.1 $ > > */ > > // This define is needed to include wincrypt,h, needed to > get client certificates > #define _WIN32_WINNT 0x0400 > > #include > #include > #include > > #include "jk_global.h" > //#include "jk_util.h" > #include "jk_map.h" > #include "jk_pool.h" > #include "jk_env.h" > #include "jk_service.h" > #include "jk_worker.h" > > #include "iis.h" > //#include "jk_uri_worker_map.h" > > #define jk_log(a,b,c) > > > static void write_error_response(PHTTP_FILTER_CONTEXT > pfc,char *status,char * msg) > { > char crlf[3] = { (char)13, (char)10, '\0' }; > char ctype[30]; > DWORD len = strlen(msg); > > sprintf(ctype, > "Content-Type:text/html%s%s", > crlf, > crlf); > > /* reject !!! */ > pfc->ServerSupportFunction(pfc, > SF_REQ_SEND_RESPONSE_HEADER, > status, > (DWORD)crlf, > (DWORD)ctype); > 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; > env->l->jkLog(env,env->l, JK_LOG_DEBUG, > "Into jk_ws_service_t::start_response\n"); > > 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); > return JK_FALSE; > } > > if (s && s->ws_private) { > isapi_private_data_t *p = s->ws_private; > if (!p->request_started) { > DWORD len_of_status; > char *status_str; > char *headers_str; > > p->request_started = JK_TRUE; > > /* > * Create the status line > */ > if (!s->msg) { > reason = ""; > } else { > reason = s->msg; > } > status_str = (char *)_alloca((6 + > strlen(reason)) * sizeof(char)); > sprintf(status_str, "%d %s", s->status, reason); > len_of_status = strlen(status_str); > > /* > * Create response headers string > */ > if (s->headers_out->size) { > int i; > unsigned len_of_headers; > for(i = 0 , len_of_headers = 0 ; i < > s->headers_out->size(env,s->headers_out) ; i++) { > len_of_headers += > strlen(s->headers_out->nameAt(env,s->headers_out,i)); > len_of_headers += > strlen(s->headers_out->valueAt(env,s->headers_out,i)); > len_of_headers += 4; /* extra for > colon, space and crlf */ > } > > len_of_headers += 3; /* crlf and > terminating null char */ > headers_str = (char > *)_alloca(len_of_headers * sizeof(char)); > headers_str[0] = '\0'; > > for(i = 0 ; i < > s->headers_out->size(env,s->headers_out) ; i++) { > strcat(headers_str, > s->headers_out->nameAt(env,s->headers_out,i)); > strcat(headers_str, ": "); > strcat(headers_str, > s->headers_out->valueAt(env,s->headers_out,i)); > strcat(headers_str, crlf); > } > strcat(headers_str, crlf); > } else { > headers_str = crlf; > } > > if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, > > HSE_REQ_SEND_RESPONSE_HEADER, > status_str, > > (LPDWORD)&len_of_status, > > (LPDWORD)headers_str)) { > jk_log(logger, JK_LOG_ERROR, > "jk_ws_service_t::start_response, > ServerSupportFunction failed\n"); > return JK_FALSE; > } > > > } > return JK_TRUE; > > } > > jk_log(logger, JK_LOG_ERROR, > "jk_ws_service_t::start_response, NULL parameters\n"); > > return JK_FALSE; > } > > static int JK_METHOD jk2_service_iis_read(jk_env_t *env, > jk_ws_service_t *s, > void *b, > unsigned l, > unsigned *a) > { > jk_log(logger, JK_LOG_DEBUG, > "Into jk_ws_service_t::read\n"); > > if (s && s->ws_private && b && a) { > isapi_private_data_t *p = s->ws_private; > > *a = 0; > if (l) { > char *buf = b; > DWORD already_read = p->lpEcb->cbAvailable - > p->bytes_read_so_far; > > if (already_read >= l) { > memcpy(buf, p->lpEcb->lpbData + > p->bytes_read_so_far, l); > p->bytes_read_so_far += l; > *a = l; > } else { > /* > * Try to copy what we already have > */ > if (already_read > 0) { > memcpy(buf, p->lpEcb->lpbData + > p->bytes_read_so_far, already_read); > buf += already_read; > l -= already_read; > p->bytes_read_so_far = p->lpEcb->cbAvailable; > > *a = already_read; > } > > /* > * Now try to read from the client ... > */ > if (p->lpEcb->ReadClient(p->lpEcb->ConnID, > buf, &l)) { > *a += l; > } else { > jk_log(logger, JK_LOG_ERROR, > "jk_ws_service_t::read, > ReadClient failed\n"); > return JK_FALSE; > } > } > } > return JK_TRUE; > } > > jk_log(logger, JK_LOG_ERROR, > "jk_ws_service_t::read, NULL parameters\n"); > return JK_FALSE; > } > > static int JK_METHOD jk2_service_iis_write(jk_env_t > *env,jk_ws_service_t *s, > const void *b, > unsigned l) > { > jk_log(logger, JK_LOG_DEBUG, > "Into jk_ws_service_t::write\n"); > > if (s && s->ws_private && b) { > isapi_private_data_t *p = s->ws_private; > > if (l) { > unsigned written = 0; > char *buf = (char *)b; > > if (!p->request_started) { > start_response(env, s ); > } > > while(written < l) { > DWORD try_to_write = l - written; > if (!p->lpEcb->WriteClient(p->lpEcb->ConnID, > buf + written, > &try_to_write, > 0)) { > jk_log(logger, JK_LOG_ERROR, > "jk_ws_service_t::write, > WriteClient failed\n"); > return JK_FALSE; > } > written += try_to_write; > } > } > > return JK_TRUE; > > } > > jk_log(logger, 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) > { > char huge_buf[16 * 1024]; /* should be enough for all */ > > DWORD huge_buf_sz; > > s->jvm_route = NULL; > > s->head = start_response; > s->read = read; > s->write = write; > > 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); > > if (s->req_uri == NULL) { > s->query_string = private_data->lpEcb->lpszQueryString; > *worker_name = DEFAULT_WORKER_NAME; > GET_SERVER_VARIABLE_VALUE("URL", s->req_uri); > if (unescape_url(s->req_uri) < 0) > return JK_FALSE; > getparents(s->req_uri); > } > > GET_SERVER_VARIABLE_VALUE("AUTH_TYPE", s->auth_type); > GET_SERVER_VARIABLE_VALUE("REMOTE_USER", s->remote_user); > GET_SERVER_VARIABLE_VALUE("SERVER_PROTOCOL", s->protocol); > GET_SERVER_VARIABLE_VALUE("REMOTE_HOST", s->remote_host); > GET_SERVER_VARIABLE_VALUE("REMOTE_ADDR", s->remote_addr); > GET_SERVER_VARIABLE_VALUE(SERVER_NAME, s->server_name); > GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80) > GET_SERVER_VARIABLE_VALUE(SERVER_SOFTWARE, s->server_software); > GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT_SECURE", > s->is_ssl, 0); > > s->method = private_data->lpEcb->lpszMethod; > s->content_length = private_data->lpEcb->cbTotalBytes; > > s->ssl_cert = NULL; > s->ssl_cert_len = 0; > s->ssl_cipher = NULL; > s->ssl_session = NULL; > s->ssl_key_size = -1; > > s->headers_in = NULL; > // s->headers_values = NULL; > // s->num_headers = 0; > > /* > * Add SSL IIS environment > */ > if (s->is_ssl) { > char *ssl_env_names[9] = { > "CERT_ISSUER", > "CERT_SUBJECT", > "CERT_COOKIE", > "HTTPS_SERVER_SUBJECT", > "CERT_FLAGS", > "HTTPS_SECRETKEYSIZE", > "CERT_SERIALNUMBER", > "HTTPS_SERVER_ISSUER", > "HTTPS_KEYSIZE" > }; > char *ssl_env_values[9] = { > NULL, > NULL, > NULL, > NULL, > NULL, > NULL, > NULL, > NULL, > NULL > }; > unsigned i; > unsigned num_of_vars = 0; > > for(i = 0 ; i < 9 ; i++) { > GET_SERVER_VARIABLE_VALUE(ssl_env_names[i], > ssl_env_values[i]); > if (ssl_env_values[i]) { > num_of_vars++; > } > } > 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 *)); > 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]; > 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); > cc.cbAllocated = sizeof(huge_buf); > cc.CertContext.pbCertEncoded = > (BYTE*) huge_buf; > cc.CertContext.cbCertEncoded = 0; > > if > (private_data->lpEcb->ServerSupportFunction(private_data->lpEc > b->ConnID, > > (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", > > cc.CertContext.dwCertEncodingType & X509_ASN_ENCODING , > > cc.CertContext.cbCertEncoded, > > cc.dwCertificateFlags); > s->ssl_cert=jk_pool_alloc(&private_data->p, > > base64_encode_cert_len(cc.CertContext.cbCertEncoded)); > > s->ssl_cert_len = > base64_encode_cert(s->ssl_cert, > > huge_buf,cc.CertContext.cbCertEncoded) - 1; > } > } > } > } > > */ > huge_buf_sz = sizeof(huge_buf); > if (get_server_value(private_data->lpEcb, > "ALL_HTTP", > huge_buf, > huge_buf_sz, > "")) { > unsigned cnt = 0; > char *tmp; > > for(tmp = huge_buf ; *tmp ; tmp++) { > if (*tmp == '\n'){ > cnt++; > } > } > > if (cnt) { > char *headers_buf = > jk_pool_strdup(&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 *)); > > if (!s->headers_names || !s->headers_values || > !headers_buf) { > return JK_FALSE; > } > > for(i = 0, tmp = headers_buf ; *tmp && i < cnt ; ) { > int real_header = JK_TRUE; > > /* Skipp the HTTP_ prefix to the beginning > of th header name */ > tmp += len_of_http_prefix; > > if (!strnicmp(tmp, URI_HEADER_NAME, > strlen(URI_HEADER_NAME)) || > !strnicmp(tmp, WORKER_HEADER_NAME, > strlen(WORKER_HEADER_NAME))) { > real_header = JK_FALSE; > } else if(need_content_length_header && > !strnicmp(tmp, CONTENT_LENGTH, > strlen(CONTENT_LENGTH))) { > need_content_length_header = FALSE; > s->headers_names[i] = tmp; > } else if (!strnicmp(tmp, > TOMCAT_TRANSLATE_HEADER_NAME, > > strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { > tmp += 6; /* TOMCAT */ > s->headers_names[i] = tmp; > } else { > s->headers_names[i] = tmp; > } > > while(':' != *tmp && *tmp) { > if ('_' == *tmp) { > *tmp = '-'; > } else { > *tmp = tolower(*tmp); > } > tmp++; > } > *tmp = '\0'; > tmp++; > > /* Skip all the WS chars after the ':' to > the beginning of th header value */ > while(' ' == *tmp || '\t' == *tmp || '\v' == *tmp) { > tmp++; > } > > if (real_header) { > s->headers_values[i] = tmp; > } > > while(*tmp != '\n' && *tmp != '\r') { > tmp++; > } > *tmp = '\0'; > tmp++; > > /* skipp CR LF */ > while(*tmp == '\n' || *tmp == '\r') { > tmp++; > } > > if (real_header) { > i++; > } > } > /* Add a content-length = 0 header if needed. > * Ajp13 assumes an absent content-length > header means an unknown, > * but non-zero length body. > */ > if(need_content_length_header) { > s->headers_names[cnt] = "content-length"; > s->headers_values[cnt] = "0"; > cnt++; > } > s->num_headers = cnt; > } else { > /* We must have our two headers */ > return JK_FALSE; > } > } else { > return JK_FALSE; > } > > 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: > > For additional commands, e-mail: > > > -- To unsubscribe, e-mail: For additional commands, e-mail: