You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by "Ignacio J. Ortega" <na...@siapi.es> on 2002/04/18 20:37:17 UTC
RE: cvs commit: jakarta-tomcat-connectors/jk/native2/server/isapi
iis.h isapi.dsp jk2_isapi_plugin.c jk_service_iis.c
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 <httpext.h>
> #include <httpfilt.h>
> #include <wininet.h>
>
> #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 <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 <ap...@apache.org>.
> *
> *
> *
> * 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/>. *
> *
> *
> *
> ==============================================================
> =========== */
>
>
> /*************************************************************
> **************
> * Description: Apache 2 plugin for Jakarta/Tomcat
> *
> * Author: Gal Shachor <sh...@il.ibm.com>
> *
> * Henri Gomez <hg...@slib.fr>
> *
> * 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 <Location>
> * 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:
> * <VirtualHost foo.com>
> * <Location /examples>
> * JkUriSet worker ajp13
> * </Location>
> * </VirtualHost>
> *
> * 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
> <Host> 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 <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 <ap...@apache.org>.
> *
> *
> *
> * 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/>. *
> *
> *
> *
> ==============================================================
> =========== */
>
> /**
> * Description: IIS Jk2 Service
> * Author: Gal Shachor <sh...@il.ibm.com>
>
> * Henri Gomez <hg...@slib.fr>
> * Ignacio J. Ortega <na...@apache.org>
> * Version: $Revision: 1.1 $
>
> */
>
> // This define is needed to include wincrypt,h, needed to
> get client certificates
> #define _WIN32_WINNT 0x0400
>
> #include <httpext.h>
> #include <httpfilt.h>
> #include <wininet.h>
>
> #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:
> <ma...@jakarta.apache.org>
> For additional commands, e-mail:
> <ma...@jakarta.apache.org>
>
>
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>