JAKARTA TOMCAT CONNECTORS 2 (JK2) CHANGELOG:            -*-text-*-
Last modified at [$Date$]

AS OF NOVEMBER 15, 2004, JK2 IS NO LONGER SUPPORTED. ALL BUGS RELATED TO JK2 
WILL BE MARKED AS WONTFIX. IN ITS PLACE, SOME OF ITS FEATURES HAVE BEEN 
BACKPORTED TO JK1. MOST OF THOSE FEATURES WILL BE SEEN IN 1.2.7 AND LATER
VERSIONS.

ANOTHER ALTERNATIVE IS THE AJP ADDITION TO MOD_PROXY WHICH WILL BE PART OF 
APACHE 2.1.

Changes in JK2 HEAD:
    * APR is now mandatory, so channel.socket is now using APR and as such
      channel.apr has been removed.
    * Added the load balancer stickySession property. If set to 0
      requests with servlet SESSION ID's can be routed to any Tomcat
      worker. Default is 1, sessions are sticky.
    * Port from jk of connect_timeout, reply_timeout, prepost_timeout (AJP13 PING/PONG).
      You could set connectTimeout, replyTimeout and prepostTimeout for such purpose in ajp properties.
      [Henri Gomez]
    * Add hasinput method for channel, which will check if datas are
      available on input channel (TC->WEBSERVER). 
      [Henri Gomez]
    * Make use apr_port_t instead of short to fix problem to have port higher than 32K.
    * Make default port configurable (9009 on Netware, 8009 elsewhere)
    * Fix problem when in Load-Balancing and POST 
      [Henri Gomez].
    * Add recovery strategy in LB mode, via noRecoveryIfRequestSent and noRecoveryIfHeaderSent options 
      [Henri Gomez].
    * Add a noErrorHeader parameter for lb worker, by default set to 1, to prevent jk2 to touch the Headers when an
      error is detected (which broke Apache 2, mod_alias and ErrorDocument) 
      [Henri Gomez].
    * Forward correctly the content-type and as such fix problems with Apache 2 and mod_deflate for example 
      [Henri Gomez].
      
      
Changes with JK2 2.0.3:
    * jk2 set correctly the content-type in Apache 2.0,
      making it ready to works with mod_deflate and AddOutputFilterByType 
      [Henri Gomez]
      
Changes with JK2 2.0.2:
    * Fix the bug 14293. Thanks to Martin Kraemer for his help.
      [Jean-Frederic Clere]
    * Don't send initial chunk for chunked encoding, fix #14282
      [Costin Manolache]
    * Fix the POST data on JNI
      [Mladen Turk]
    * Remove the deprecated message for path
      [Costin Manolache]
    * Add the regular expressions to uriMap. The regex uris are differentiated
      to normal one by starting with dollar ($) sign.
      [Mladen Turk]
    * Add the max_connections to the wajp13 worker.
      [Mladen Turk]    
    * Add the hostMap cache
      [Mladen Turk] 
    * Allow the lb:name scheme inside the [channel.xxx]
      [Mladen Turk]
    * Duplicate all global directives on each vhost that has inheritGlobals set.
      Directives   are   created   using   createBean   only   if   not   found.
      Beside directives, the webapps are duplicated to.
      [Mladen Turk]
      
Changes with JK2 2.0.1:

    * Tentative fix for 12346.
      If an unrecoverable error happens ( for example when the client hits  stop
      the server can't send more data   since the connection is lost )  we  need
      to forcefully break the ajp13 connection, since tomcat can't know this and
      will continue to send data.

      This behavior is a result of the optimizations made for the 'normal' case,
      i.e.  the fact  that tomcat  doesn't wait  for confirmation  when  sending
      chunks of data.  Adding the roundtrip  will have big  negative performance
      hit - and it's better to deal with the error cases.

      Note that  the alternative  ( and  what seems  to happen  for apache  ) is
      to ignore  the server  errors and  continue to  receive chunks  and ignore
      them.  That  can save  the  ajp  connection -   with the  price  of having
      tomcat  send useless data. For a  large file that  may be a  bad solution,
      and  tomcat will not  be notified that the client had problems ( which may
      be a usefull info ).

      If  this  doesn't  fix  the  problem  -  please  send  me  logs  with  ajp
      debug enabled. I can't reproduce it ( or run IIS ), but this is clearly  a
      bug. [Costin Manolache] 

    * Fix the logger_file      
      Change the default logger to the jk2.log (was mod_jk.log)
      Fix the ${serverRoot} replaceProperties.
      Do not close log file if it is stderr.
      [Mladen Turk]
      
    * Fix the  apr_socket default timeout  value, and the  send/recv that caused
      wrong header readings. [Mladen Turk]
      
    * Fix and rewrite the hostMap. It was  a real mess. There was also a bug  in    
      the  code  that  caused  host  mapping to  be  sensitive  to the  order of
      directives in the config. [Mladen Turk]
      
    * Introduce the  timeout option for  the load balancer.  The timeout if  set    
      will force the lb to cycle  through workers if all are in  the error_state
      for the specified amount of  seconds. This  is useful for  situations when
      the  TC is  overloaded and   refuses new  connections. The  lb  will  wait
      and  after timeout will report 500 to the client. [Mladen Turk]
