TOMCAT CONNECTORS (JK) CHANGELOG:           -*-text-*-
Last modified at [$Date$]
PLEASE DON'T WRITE IN THIS FILE BUT IN ../xdocs/changelog.xml AND USE ../tools/jkrelease.sh
TO BUILD THE TEXT VERSION.

Changes in JK 1.2.11
    * BUG 34358: Fix the load balance worker load balance method. It was not being
      set from the worker.properties file
    * BUG 34357: Fix a segfault in Apache 2 when using JKAutoAlias.
    * Update tomcat_trend.pl for new error log string formatting.

Changes in JK 1.2.10
    * Do not mark the worker in error state if headers are larger then AJP13
      limit.

Changes in JK 1.2.9
    * lbfactor is now relationship between members, so worker.a.lbfactor=1 and worker.b.lbfactor=1
      will give 50-50% load.
    * Use of shm for load balancer via JkShmFile. Be sure to define JkShmFile /path/to/smfile 
      in your httpd.conf
    * on Series you should use the latest PTF for Apache 2.0 (which is now 2.0.52) and ad minima
      SI17402/SI17061 or cumulative including them.
     
Changes in JK 1.2.8
    * cachesize has changed from unlimited to limited, so it's basically a pool of connections 
      with recycle timeout like in mod_proxy for Apache 2.2.
      
Changes with JK 1.2.7
    * Fix iis redirector that was figuring .properties
      file on each request [mturk]
    * Start fixing 64/32 bit compatibility issues [mturk]
    * Indent all source files. [mturk]
    
Changes with JK 1.2.6
    * Fix POST Recovery problems in LB mode [hgomez]
    * Add CPING/CPONG support to avoid problems with hang tomcats [hgomez]
    * Make POST recovery in LB configurable [hgomez]
    * Update to Apache License 2.0 [hgomez]
    * For Apache 2.0, when the env var no-jk is present, mod_jk didn't handle request (declined)
      and as such dont forward requests to tomcats even if URL match.
      To be used with SetEnvIf or BrowserMatch directives for example to exclude some URL/URI or
      Browser [hgomez].
    * Add a fix for iSeries (AS/400) which use XOPEN/Unix98 APIs and need sa_len to be set when
      calling connect(), it will resolve the error EINVAL in jk_connect [hgomez].
      
Changes with JK 1.2.5
    * Fix a thread safe bug when mapping URI's.
      [billbarker]
    * Fix a thread safe bug when resolving worker host name
      when using mod_jk with Apache 2 and the worker MPM.
      [hgomez]
    * Remove an unnecessary error message when connections to
      all load balanced workers fail.
      [glenn]
    * When mod_jk cannot connect to a worker include the name of
      the worker in the error message.  This is especially helpful
      when you are using load balanced workers.
      [glenn]
    * Fix problem with mod_jk.log getting opened multiple times for
      Apache 2. Only one mod_jk.log can be configured.
      [glenn]
    * Fix Apache 2 connector so that DirectoryIndex works for an
      index.jsp page if JkOptions ForwardDirectories was configured.
      [hgomez]
    * Fix exposure of JSP source if a //path/to.jsp URL was requested
      in Apache 1.3 and Apache 2.0 connector.
      [billbarker]

Changes with JK 1.2.4
    * Fix use of libtool for Apache mod_jk builds with more recent
      versions of Apache 2.
      [jfclere]
    * Use reentrant version of strtok() for web server's which use
      threads. This fixes a thread safe bug under Apache 2 and the
      worker MPM.
      [glenn]
    * Fix the Apache 2 mod_jk hook priority so that mod_jk works
      well with both mod_alias and mod_dir.
      [glenn]

Changes with JK 1.2.3:
    * Add the ability to configure JkLog to pipe its log output to an
      executable such as Apache rotatelogs or cronolog.  Apache 2.0 only.
      [glenn]
    * Add JkAutoAlias to Apache 2.0
      [glenn]
    * Apache 2/1.3, if Tomcat returns an error but not content,
      let Apache handle processing the error returned by Tomcat.
    * Added the load balancer sticky_session property. If set to 0
      requests with servlet SESSION ID's can be routed to any Tomcat
      worker. Default is 1, sessions are sticky.
      [glenn]
    * Cleaned up detection and reporting of aborted client connections.
      This cleanup also makes sure that mod_jk does not pass any requests
      on to Tomcat if the remote client aborted its connection.
      [glenn]
    * Fixed a bug in Apache 2.0 which caused a POST request forwarded to
      Tomcat to fail if it generated SSI directives which were post
      processed by mod_include.
      [glenn]
    * Fixed a bug in JkRequestLogFormat when printing the request URI that
      could cause a URI with hex escapes sequences to be formatted wrong.
      [glenn]
      
Changes with JK 1.2.2:
    * tomcat_trend.pl updated script to support changed logging of 
      aborted requests
      [glenn]
    * jk set correctly the content-type in Apache 2.0,
      making it ready to works with mod_deflate and AddOutputFilterByType 
      [hgomez]
    * jk will check result of get_endpoint and handle a failure.
      This call can fail if the allocation for the endpoint fails because of low memory conditions 
      causing a dereference of NULL when we try and access the endpoint
      [mmanders]
      
Changes with JK 1.2.1:
    * Don't send initial chunk for chunked encoding, fix #14282
      [costin]
    * Add perl scripts for analyzing mod_jk logs and generating graphs/reports  
      [glenn]
    * Make JK honor the CanonicalHost directive.
      [hgomez]
    * Log cleanup
      [costin]
    * Fix typos in jk xdocs/docs
      [hgomez]
    * Add JkRequestLogFormat to Apache 2.0
      [hgomez]
    * Final patches to make JK iSeries compliant
      [hgomez]
      
