You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2012/03/25 22:49:53 UTC

svn commit: r1305124 [3/17] - in /tomcat/site/trunk/docs/connectors-doc-archive: ./ jk2/ jk2/common/ jk2/common/printer/ jk2/images/ jk2/jk/ jk2/jk/printer/ jk2/jk2/ jk2/jk2/printer/ jk2/printer/

Added: tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13-extensions-proposal.html
URL: http://svn.apache.org/viewvc/tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13-extensions-proposal.html?rev=1305124&view=auto
==============================================================================
--- tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13-extensions-proposal.html (added)
+++ tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13-extensions-proposal.html Sun Mar 25 20:49:51 2012
@@ -0,0 +1,962 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html xmlns="http://www.w3.org/TR/xhtml1/strict">
+<head>
+<title>AJPv13 extensions Proposal</title>
+<!--
+   Copyright 1999-2004 The Apache Software Foundation
+ 
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<meta content="1999-2004 The Apache Software Foundation" name="copyright"/>
+<meta content="$Date: 2002/09/20 21:35:31 $" name="last-changed"/>
+<meta content="Henri Gomez" name="author"/>
+<meta content="hgomez@apache.org" name="email"/>
+<link href="..//style.css" type="text/css" rel="stylesheet"/>
+<link href="../images/tomcat.ico" rel="shortcut icon"/>
+</head>
+<body link="#525D76" vlink="#525D76" alink="#525D76" text="#000000" bgcolor="#ffffff">
+<a name="TOP"/>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr height="1">
+<td class="nil" height="1" bgcolor="#ffffff" width="150">
+<img hspace="0" vspace="0" height="1" width="150" border="0" src="../images/pixel.gif"/>
+</td>
+<td class="nil" height="1" bgcolor="#ffffff" width="*">
+<img hspace="0" vspace="0" height="1" width="370" border="0" src="../images/pixel.gif"/>
+</td>
+</tr>
+<tr>
+<td width="*" colspan="2" class="logo" bgcolor="#ffffff">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left">
+<img align="left" height="48" width="505" border="0" src="../images/jakarta.gif"/>
+</td>
+<td align="right">
+<img align="right" border="0" src="../images/mod_jk.jpg"/>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td colspan="2" width="*" align="right" class="head" bgcolor="#999999">
+<nobr>
+<a href="http://www.apache.org/" class="head">Apache Software Foundation</a> |
+                <a href="http://jakarta.apache.org/" class="head">Jakarta Project</a> |
+                <a href="http://jakarta.apache.org/tomcat/" class="head">Apache Tomcat</a>
+</nobr>
+</td>
+</tr>
+<tr>
+<td class="body" valign="top" width="*" bgcolor="#ffffff">
+<table cellspacing="4" width="100%" border="0">
+<tr>
+<td nowrap="true" valign="top" align="left">
+<h2>AJPv13 extensions Proposal</h2>
+</td>
+<td nowrap="true" valign="top" align="right">
+<img border="0" hspace="0" vspace="0" height="1" width="1" src="../images/void.gif"/>
+</td>
+</tr>
+</table>
+<a name="Introduction">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Introduction</td>
+</tr>
+</table>
+</a>
+<p class="section">
+This document is a proposal of evolution of the current
+Apache JServ Protocol version 1.3, also known as ajp13.  
+I'll not cover here the full protocol but only the add-on from ajp13.
+
+This nth pass include comments from the tomcat-dev list and
+misses discovered during developpment.
+</p>
+<a name="sub_Missing features in AJP13">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Missing features in AJP13</td>
+</tr>
+</table>
+</a>
+<p class="section">
+ajp13 is a good protocol to link a servlet engine like tomcat to a web server like Apache: 
+
+<ul>
+<li>
+use persistants connections to avoid reconnect time at each request
+</li>
+<li>
+encode many http commands to reduce stream size
+</li>
+<li>
+send to servlet engine many info from web server (like SSL certs)
+</li>
+</ul>
+
+<ul>
+<li>
+  security between web server and servlet engine.
+  Anybody can connect to an ajp13 port (no login mecanism used)
+  You could connect, for example with telnet, and keep the remote thread
+  up by not sending any data (no timeout in connection)
+</li>
+<li>
+  context information passed from servlet engine to web server.
+  Part of the configuration of JK, the web server connector, is to
+  indicate to the web server which URI to handle. 
+  The mod_jk JkMount directive, told to web server which URI must be 
+  forwarded to servlet engine.
+  A servlet engine allready knows which URI it handle and TC 3.3 is
+  allready capable to generate a config file for JK from the list
+  of available contexts.
+</li>
+<li>
+  state update of contexts from servlet engine to web server.
+  Big site with farm of Tomcat, like ISP and virtuals hosters,
+  may need to stop a context for admin purposes. In that case the front
+  web server must know that the context is currently down, to eventually
+  relay the request to another Tomcat
+</li>
+<li>
+  verify state of connection before sending request.
+  Actually JK send the request to the servlet engine and next wait 
+  for the answer. But one of the beauty of the socket API, is you that 
+  you could write() to a closed connection without any error reporting, 
+  but a read() to a closed connection return you the error code. 
+</li>
+</ul>
+
+</p>
+<br/>
+<a name="sub_Proposed add-ons to AJP13">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Proposed add-ons to AJP13</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Let's descrive here the features and add-on that could be added to AJP13.
+Since this document is a proposal, a reasonable level of chaos must be expected at first.
+Be sure that discussion on tomcat list will help clarify points, add 
+features but the current list seems to be a 'minimun vital'
+
+<ul>
+<li>
+Advanced login features at connect time
+</li>
+<li>
+Basic authorisation system, where a shared secret key is
+present in web server and servlet engine.
+</li>
+<li>
+Basic protocol negociation, just to be sure that if functionnalities are added
+to AJP13 in the future, current implementations will still works.
+</li>
+<li>
+Clean handling of 'Unknown packets'
+</li>
+<li>
+Extended env vars passed from web-server to servlet engine.
+</li>
+<li>
+Add extra SSL informations needed by Servlet 2.3 API (like SSL_KEY_SIZE)
+</li>
+</ul>
+
+</p>
+<br/>
+<a name="sub_Advanced login">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Advanced login</td>
+</tr>
+</table>
+</a>
+<p class="section">
+
+<ol>
+<li>
+WEB-SERVER send LOGIN INIT CMD + NEGOCIATION DATA + WEB SERVER INFO
+</li>
+<li>
+  TOMCAT respond with LOGIN SEED CMD + RANDOM DATA
+</li>
+<li>
+  WEB-SERVER calculted the MD5 of RANDOM DATA+SECRET DATA
+</li>
+<li>
+  WEB-SERVER send LOGIN COMP CMD + MD5 (SECRET DATA + RANDOM DATA)
+</li>
+<li>
+  TOMCAT respond with LOGIN STATUS CMD + NEGOCIED DATA + SERVLET ENGINE INFO
+</li>
+</ol>
+
+To prevent DOS attack, the servlet engine will wait
+the LOGIN CMD only 15/30 seconds and reports the
+timeout exception for admins investigation.
+
+The login command will contains basic protocol
+negociation information like compressing ability, 
+crypto, context info (at start up), context update at 
+run-time (up/down), level of SSL env vars, AJP protocol
+level supported (level1/level2/level3...)
+
+The Web server info will contain web server info and
+connector name (ie Apache 1.3.26 + mod_ssl 2.8.8 + mod_jk 1.2.1 + mod_perl 1.25).
+
+The servlet engine will mask the negociation mask with it's own
+mask (what it can do) and return it when loggin is accepted.
+
+This will help having a basic AJP13 implementation (level 1)
+on a web-server working with a more advanced protocol handler on
+the servlet engine side or vice-versa.
+
+AJP13 was designed to be small and fast and so many
+SSL informations present in the web-server are not
+forwarded to the servlet engine. 
+
+We add here four negociations flags to provide more
+informations on client SSL data (certs), server SSL datas, 
+crypto used, and misc datas (timeout...). 
+</p>
+<br/>
+<a name="sub_Messages Stream">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Messages Stream</td>
+</tr>
+</table>
+</a>
+<p class="section">
+<pre class="section">
++----------------+------------------+-----------------+
+| LOGIN INIT CMD | NEGOCIATION DATA | WEB SERVER INFO |
++----------------+------------------+-----------------+
+
++----------------+----------------+
+| LOGIN SEED CMD | MD5 of entropy |
++----------------+----------------+
+
++----------------+----------------------------+
+| LOGIN COMP CMD | MD5 of RANDOM + SECRET KEY |
++----------------+----------------------------+
+
++-----------+---------------+---------------------+
+| LOGOK CMD | NEGOCIED DATA | SERVLET ENGINE INFO |
++-----------+---------------+---------------------+
+
++------------+--------------+
+| LOGNOK CMD | FAILURE CODE |
++------------+--------------+
+</pre>
+
+<ul>
+<li>
+LOGIN INIT CMD, LOGIN SEED CMD, LOGIN COMP CMD, LOGOK CMD, LOGNOK CMD are 1 byte long.
+</li>
+<li>
+MD5, MD5 of RANDOM + SECRET KEY are 32 chars long.
+</li>
+<li>
+NEGOCIATION DATA, NEGOCIED DATA, FAILURE CODE are 32 bits long.
+</li>
+<li>
+WEB SERVER INFO, SERVLET ENGINE INFO are CString.
+</li>
+</ul>
+
+The secret key will be set by a new propertie in
+workers.properties : secretkey
+<pre class="section">
+worker.ajp13.port=8009
+worker.ajp13.host=localhost
+worker.ajp13.type=ajp13
+worker.ajp13.secretkey=myverysecretkey
+</pre>
+</p>
+<br/>
+<a name="sub_Shutdown feature">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Shutdown feature</td>
+</tr>
+</table>
+</a>
+<p class="section">
+AJP13 miss a functionnality of AJP12, which is shutdown command.
+A logout will tell servlet engine to shutdown itself.
+<pre class="section">
++--------------+----------------------------+
+| SHUTDOWN CMD | MD5 of RANDOM + SECRET KEY |
++--------------+----------------------------+
+
++------------+
+| SHUTOK CMD |
++------------+
+
++-------------+--------------+
+| SHUTNOK CMD | FAILURE CODE |
++-------------+--------------+
+</pre>
+
+<ul>
+<li>
+SHUTDOWN CMD, SHUTOK CMD, SHUTNOK CMD are 1 byte long.
+</li>
+<li>
+MD5 of RANDOM + SECRET KEY are 32 chars long.
+</li>
+<li>
+FAILURE CODE is 32 bits long.
+</li>
+</ul>
+
+</p>
+<br/>
+<a name="sub_Extended Env Vars feature">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Extended Env Vars feature</td>
+</tr>
+</table>
+</a>
+<p class="section">
+NOTA:
+
+While working on AJP13 in JK, I really discovered "JkEnvVar". 
+The following "Extended Env Vars feature" description may not
+be implemented in extended AJP13 since allready available in original
+implementation.
+
+DESC:
+
+Many users will want to see some of their web-server env vars 
+passed to their servlet engine.
+
+To reduce the network traffic, the web-servlet will send a 
+table to describing the external vars in a shorter fashion.
+
+We'll use there a functionnality allready present in AJP13,
+attributes list :
+
+In the AJP13, we've got :
+
+<pre class="section">
+AJP13_FORWARD_REQUEST :=
+    prefix_code      2
+    method           (byte)
+    protocol         (string)
+    req_uri          (string)
+    remote_addr      (string)
+    remote_host      (string)
+    server_name      (string)
+    server_port      (integer)
+    is_ssl           (boolean)
+    num_headers      (integer)
+    request_headers *(req_header_name req_header_value)
+
+    ?context       (byte string)
+    ?servlet_path  (byte string)
+    ?remote_user   (byte string)
+    ?auth_type     (byte string)
+    ?query_string  (byte string)
+    ?jvm_route     (byte string)
+    ?ssl_cert      (byte string)
+    ?ssl_cipher    (byte string)
+    ?ssl_session   (byte string)
+
+    ?attributes   *(attribute_name attribute_value)
+    request_terminator (byte)
+</pre>
+
+Using short 'web server attribute name' will reduce the 
+network traffic.
+ 
+<pre class="section">
++-------------------+---------------------------+-------------------------------+----+
+| EXTENDED VARS CMD | WEB SERVER ATTRIBUTE NAME | SERVLET ENGINE ATTRIBUTE NAME | ES |
++-------------------+---------------------------+-------------------------------+----+
+</pre>
+
+ie :
+
+<pre class="section">
+JkExtVars S1 SSL_CLIENT_V_START javax.servlet.request.ssl_start_cert_date
+JkExtVars S2 SSL_CLIENT_V_END   javax.servlet.request.ssl_end_cert_date
+JkExtVars S3 SSL_SESSION_ID     javax.servlet.request.ssl_session_id
+
+
++-------------------+----+-------------------------------------------+
+| EXTENDED VARS CMD | S1 | javax.servlet.request.ssl_start_cert_date |
++-------------------+----+-------------------------------------------+
++----+-----------------------------------------+
+| S2 | javax.servlet.request.ssl_end_cert_date |
++----+-----------------------------------------+
++----+-----------------------------------------+
+| S3 | javax.servlet.request.ssl_end_cert_date |
++----+-----------------------------------------+
+</pre>
+
+During transmission in extended AJP13 we'll see attributes name
+containing S1, S2, S3 and attributes values of 
+2001/01/03, 2002/01/03, 0123AFE56.
+ 
+This example showed the use of extended SSL vars but 
+any 'personnal' web-server vars like custom authentification
+vars could be reused in the servlet engine.
+The cost will be only some more bytes in the AJP traffic.
+
+<ul>
+<li>
+EXTENDED VARS CMD is 1 byte long.
+</li>
+<li>
+WEB SERVER ATTRIBUTE NAME, SERVLET ENGINE ATTRIBUTE NAME are CString.
+</li>
+<li>
+ES is an empty CString.
+</li>
+</ul>
+
+</p>
+<br/>
+<a name="sub_Context informations forwarding for Servlet engine to Web Server">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Context informations forwarding for Servlet engine to Web Server</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Just after the LOGON PHASE, the web server will ask for the list of contexts
+and URLs/URIs handled by the servlet engine.
+It will ease installation in many sites, reduce questions about configuration 
+on tomcat-user list, and be ready for servlet API 2.3.
+
+This mode will be activated by a new directive JkAutoMount 
+
+ie: JkAutoMount examples myworker1 /examples/
+
+If we want to get ALL the contexts handled by the servlet engine, willcard
+could be used :
+
+ie: JkAutoMount * myworker1 *
+
+A servlet engine could have many contexts, /examples, /admin, /test.
+We may want to use only some contexts for a given worker. It was
+done previously, in apache HTTP server for example, by setting by 
+hand the JkMount accordingly in each [virtual] area of Apache.
+
+If you web-server support virtual hosting, we'll forward also that
+information to servlet engine which will only return contexts for
+that virtual host. 
+In that case the servlet engine will only return the URL/URI matching
+these particular virtual server (defined in server.xml). 
+This feature will help ISP and big sites which mutualize large farm
+of Tomcat in load-balancing configuration.
+
+<pre class="section">
++-----------------+-------------------+----------+----------+----+
+| CONTEXT QRY CMD | VIRTUAL HOST NAME | CONTEXTA | CONTEXTB | ES |
++-----------------+-------------------+----------+----------+----+
+
++------------------+-------------------+----------+-------------------+----------+---------------+----+
+| CONTEXT INFO CMD | VIRTUAL HOST NAME | CONTEXTA | URL1 URL2 URL3 ES | CONTEXTB | URL1 URL2 ... | ES |
++------------------+-------------------+----------+-------------------+----------+---------------+----+
+</pre>
+
+We'll discover via context-query, the list of URL/MIMES handled by the remove servlet engine
+for a list of contextes.
+In wildcard mode, CONTEXTA will contains just '*'.
+
+<ul>
+<li>
+CONTEXT QRY CMD and CONTEXT INFO CMD are 1 byte long.
+</li>
+<li>
+VIRTUAL HOST NAME is a CString, ie an array of chars terminated by a null byte (/0).
+</li>
+<li>
+An empty string is just a null byte (/0).
+</li>
+<li>
+ES is an empty CString. Indicate end of URI/URLs or end of CONTEXTs.
+</li>
+</ul>
+
+NB:<br/>
+When VirtualMode is not to be used, the VIRTUAL HOST NAME is '*'.
+In that case the servlet engine will send all contexts handled.
+</p>
+<br/>
+<a name="sub_Context informations updates from Servlet engine to Web Server">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Context informations updates from Servlet engine to Web Server</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Context update are messages caming from the servlet engine each time a context 
+is desactivated/reactivated. The update will be in use when the directive JkUpdateMount.
+This directive will set the AJP13_CONTEXT_UPDATE_NEG flag.
+
+ie: JkUpdateMount myworker1
+
+<pre class="section">
++--------------------+-------------------+----------+--------+----------+--------+----+
+| CONTEXT UPDATE CMD | VIRTUAL HOST NAME | CONTEXTA | STATUS | CONTEXTB | STATUS | ES |
++--------------------+-------------------+----------+--------+----------+--------+----+
+</pre>
+
+<ul>
+<li>
+CONTEXT UPDATE CMD, STATUS are 1 byte long.
+</li>
+<li>
+VIRTUAL HOST NAME, CONTEXTS are CString.
+</li>
+<li>
+ES is an empty CString. Indicate end of CONTEXTs.
+</li>
+</ul>
+
+NB:<br/>
+When VirtualMode is not in use, the VIRTUAL HOST NAME is '*'.
+STATUS is one byte indicating if context is UP/DOWN/INVALID
+</p>
+<br/>
+<a name="sub_Context status query to Servlet engine">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Context status query to Servlet engine</td>
+</tr>
+</table>
+</a>
+<p class="section">
+This query will be used by the web-server to determine if a given
+contexts are UP, DOWN or INVALID (and should be removed).
+
+<pre class="section">
++-------------------+--------------------+----------+----------+----+
+| CONTEXT STATE CMD |  VIRTUAL HOST NAME | CONTEXTA | CONTEXTB | ES |
++-------------------+--------------------+----------+----------+----+
+
++-------------------------+-------------------+----------+--------+----------+--------+----+
+| CONTEXT STATE REPLY CMD | VIRTUAL HOST NAME | CONTEXTA | STATUS | CONTEXTB | STATUS | ES |
++-------------------------+-------------------+----------+-------------------+--------+----+
+</pre>
+
+<ul>
+<li>
+CONTEXT STATE CMD, CONTEXT STATE REPLY CMD, STATUS are 1 byte long.
+</li>
+<li>
+VIRTUAL HOST NAME, CONTEXTs are CString
+</li>
+<li>
+ES is an empty CString
+</li>
+</ul>
+
+NB:<br/>
+When VirtualMode is not in use, the VIRTUAL HOST NAME is an empty string. 
+</p>
+<br/>
+<a name="sub_Handling of unknown packets">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Handling of unknown packets</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Sometimes even with a well negocied protocol, we may be in a situation 
+where one end (web server or servlet engine), will receive a message it
+couldn't understand. In that case the receiver will send an 
+'UNKNOW PACKET CMD' with attached the unhandled message.
+
+<pre class="section">
++--------------------+------------------------+-------------------+
+| UNKNOWN PACKET CMD | UNHANDLED MESSAGE SIZE | UNHANDLED MESSAGE |
++--------------------+------------------------+-------------------+
+</pre>
+
+Depending on the message, the sender will report an error and if 
+possible will try to forward the message to another endpoint.
+
+<ul>
+<li>
+UNKNOWN PACKET CMD is 1 byte long.
+</li>
+<li>
+UNHANDLED MESSAGE SIZE is 16bits long.
+</li>
+<li>
+UNHANDLED MESSAGE is an array of byte (length is contained in UNHANDLED MESSAGE SIZE)
+</li>
+</ul>
+
+NB:<br/>
+added UNHANDLED MESSAGE SIZE (development)
+</p>
+<br/>
+<a name="sub_Verification of connection before sending request">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Verification of connection before sending request</td>
+</tr>
+</table>
+</a>
+<p class="section">
+NOTA: This fonctionality may never be used, since it may slow up the normal process
+since requiring on the web-server side an extra IO (read) before forwarding
+the request.....
+
+One of the beauty of socket APIs, is that you could write on a half closed socket.
+When servlet engine close the socket, the web server will discover it only at the
+next read() to the socket. 
+Basically, in the AJP13 protocol, the web server send the HTTP HEADER and HTTP BODY 
+(POST by chunk of 8K) to the servlet engine and then try to receive the reply. 
+If the connection was broken the web server will learn it only at receive time.
+
+We could use a buffering scheme but what happen when you use the servlet engine
+for upload operations with more than 8ko of datas ?
+
+The hack in the AJP13 protocol is to add some bytes to read after the end of the
+service :
+
+<pre class="section">
+EXAMPLE OF DISCUSSION BETWEEN WEB SERVER AND SERVLET ENGINE
+
+AJP HTTP-HEADER (+ HTTP-POST)   (WEB-&gt;SERVLET)
+
+AJP HTTP-REPLY					(SERVLET-&gt;WEB)
+
+AJP END OF DISCUSSION			(SERVLET-&gt;WEB)
+						
+---&gt; AJP STATUS 				(SERVLET-&gt;WEB AJP13)
+</pre>
+
+The AJP STATUS will not be read by the servlet engine at the end of 
+the request/response #N but at the begining of the next session.
+
+More at that time the web server could also use OS dependants functions
+(or better APR functions) to determine if there is also more data 
+to read. And that datas could be CONTEXT Updates. 
+
+This will avoid the web server sending a request to a 
+desactivated context. In that case, if the load-balancing is used,
+it will search for another servlet engine to handle the request.
+
+And that feature will help ISP and big sites with farm of tomcat, 
+to updates their servlet engine without any service interruption.
+
+<pre class="section">
++------------+-------------+
+| STATUS CMD | STATUS DATA |
++------------+-------------+
+</pre>
+
+<ul>
+<li>
+STATUS CMD and STATUS DATA are one byte long.
+</li>
+</ul>
+</p>
+<br/>
+<br/>
+<a name="Conclusion">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Conclusion</td>
+</tr>
+</table>
+</a>
+<p class="section">
+The goal of the extended AJP13 protocol is to overcome some of the original AJP13 limitation.
+An easier configuration, a better support for large site and farm of Tomcat, 
+a simple authentification system and provision for protocol updates.
+
+Using the stable ajp13 implementation in JK (native) and in servlet 
+engine (java), it's a reasonable evolution of the well known ajp13.
+</p>
+<br/>
+<a name="Commands and IDs in extended AJP13 Index">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Commands and IDs in extended AJP13 Index</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Index of Commands and ID to be added in AJP13 Protocol
+</p>
+<a name="sub_Commands IDs">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Commands IDs</td>
+</tr>
+</table>
+</a>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Command Name</td>
+<td align="middle" valign="top" bgcolor="#039acc">Command Number</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_LOGINIT_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x10</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_LOGSEED_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x11</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_LOGCOMP_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x12</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_LOGOK_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x13</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_LOGNOK_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x14</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_QRY_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x15</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_INFO_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x16</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_UPDATE_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x17</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_STATUS_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x18</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SHUTDOWN_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x19</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SHUTOK_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x1A</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SHUTNOK_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x1B</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_STATE_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x1C</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_STATE_REP_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x1D</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_UNKNOW_PACKET_CMD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x1E</td>
+</tr>
+</table>
+
+</p>
+<br/>
+<a name="sub_Negociations Flags">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Negociations Flags</td>
+</tr>
+</table>
+</a>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Command Name</td>
+<td align="middle" valign="top" bgcolor="#039acc">Number</td>
+<td align="middle" valign="top" bgcolor="#039acc">Description</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_INFO_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x80000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">web-server want context info after login</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_UPDATE_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x40000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">web-server want context updates</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_GZIP_STREAM_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x20000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">web-server want compressed stream</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_DES56_STREAM_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x10000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">web-server want crypted DES56 stream with secret key</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SSL_VSERVER_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x08000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Extended info on server SSL vars</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SSL_VCLIENT_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x04000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Extended info on client SSL vars</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SSL_VCRYPTO_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x02000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Extended info on crypto SSL vars</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SSL_VMISC_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x01000000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Extended info on misc SSL vars</td>
+</tr>
+</table>
+
+<br/>
+
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Negociation ID</td>
+<td align="middle" valign="top" bgcolor="#039acc">Number</td>
+<td align="middle" valign="top" bgcolor="#039acc">Description</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_PROTO_SUPPORT_AJPXX_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x00FF0000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">mask of protocol supported</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_PROTO_SUPPORT_AJP13L1_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x00010000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">communication could use AJP13 Level 1</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_PROTO_SUPPORT_AJP13L2_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x00020000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">communication could use AJP13 Level 2</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_PROTO_SUPPORT_AJP13L3_NEG</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x00040000</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">communication could use AJP13 Level 3</td>
+</tr>
+</table>
+
+<br/>
+All others flags must be set to 0 since they are reserved for future use.
+
+</p>
+<br/>
+<a name="sub_Failure IDs">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Failure IDs</td>
+</tr>
+</table>
+</a>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Failure Id</td>
+<td align="middle" valign="top" bgcolor="#039acc">Number</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_BAD_KEY_ERR</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xFFFFFFFF</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_ENGINE_DOWN_ERR</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xFFFFFFFE</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_RETRY_LATER_ERR</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xFFFFFFFD</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_SHUT_AUTHOR_FAILED_ERR</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xFFFFFFFC</td>
+</tr>
+</table>
+</p>
+<br/>
+<a name="sub_Status">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Status</td>
+</tr>
+</table>
+</a>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Failure Id</td>
+<td align="middle" valign="top" bgcolor="#039acc">Number</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_DOWN</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x01</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_UP</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x02</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">AJP13_CONTEXT_OK</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x03</td>
+</tr>
+</table>
+</p>
+<br/>
+<br/>
+</td>
+</tr>
+</table>
+</body>
+</html>

Propchange: tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13-extensions-proposal.html
------------------------------------------------------------------------------
    svn:executable = *

Added: tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13.html
URL: http://svn.apache.org/viewvc/tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13.html?rev=1305124&view=auto
==============================================================================
--- tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13.html (added)
+++ tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13.html Sun Mar 25 20:49:51 2012
@@ -0,0 +1,1083 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html xmlns="http://www.w3.org/TR/xhtml1/strict">
+<head>
+<title>AJPv13</title>
+<!--
+   Copyright 1999-2004 The Apache Software Foundation
+ 
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+ 
+       http://www.apache.org/licenses/LICENSE-2.0
+ 
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<meta content="1999-2004 The Apache Software Foundation" name="copyright"/>
+<meta content="$Date: 2004/07/31 11:34:52 $" name="last-changed"/>
+<meta content="danmil@shore.net" name="author"/>
+<meta content="danmil@shore.net" name="email"/>
+<meta content="Jean-Frederic Clere" name="author"/>
+<meta content="jfrederic.clere@fujitsu-siemens.com" name="email"/>
+<link href="..//style.css" type="text/css" rel="stylesheet"/>
+<link href="../images/tomcat.ico" rel="shortcut icon"/>
+</head>
+<body link="#525D76" vlink="#525D76" alink="#525D76" text="#000000" bgcolor="#ffffff">
+<a name="TOP"/>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr height="1">
+<td class="nil" height="1" bgcolor="#ffffff" width="150">
+<img hspace="0" vspace="0" height="1" width="150" border="0" src="../images/pixel.gif"/>
+</td>
+<td class="nil" height="1" bgcolor="#ffffff" width="*">
+<img hspace="0" vspace="0" height="1" width="370" border="0" src="../images/pixel.gif"/>
+</td>
+</tr>
+<tr>
+<td width="*" colspan="2" class="logo" bgcolor="#ffffff">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left">
+<img align="left" height="48" width="505" border="0" src="../images/jakarta.gif"/>
+</td>
+<td align="right">
+<img align="right" border="0" src="../images/mod_jk.jpg"/>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td colspan="2" width="*" align="right" class="head" bgcolor="#999999">
+<nobr>
+<a href="http://www.apache.org/" class="head">Apache Software Foundation</a> |
+                <a href="http://jakarta.apache.org/" class="head">Jakarta Project</a> |
+                <a href="http://jakarta.apache.org/tomcat/" class="head">Apache Tomcat</a>
+</nobr>
+</td>
+</tr>
+<tr>
+<td class="body" valign="top" width="*" bgcolor="#ffffff">
+<table cellspacing="4" width="100%" border="0">
+<tr>
+<td nowrap="true" valign="top" align="left">
+<h2>AJPv13</h2>
+</td>
+<td nowrap="true" valign="top" align="right">
+<img border="0" hspace="0" vspace="0" height="1" width="1" src="../images/void.gif"/>
+</td>
+</tr>
+</table>
+<a name="Intro">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Intro</td>
+</tr>
+</table>
+</a>
+<p class="section">
+The original document was written by
+Dan Milstein, <a href="mailto:danmil@shore.net">danmil@shore.net</a>
+on December 2000. The present document is generated out of an xml file
+to allow a more easy integration in the Tomcat documentation.
+
+</p>
+<p class="section">
+This describes the Apache JServ Protocol version 1.3 (hereafter
+<b>
+<font color="#333333">ajp13</font>
+</b>).  There is, apparently, no current documentation of how the
+protocol works.  This document is an attempt to remedy that, in order to
+make life easier for maintainers of JK, and for anyone who wants to
+port the protocol somewhere (into jakarta 4.x, for example).
+</p>
+<br/>
+<a name="author">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>author</td>
+</tr>
+</table>
+</a>
+<p class="section">
+I am not one of the designers of this protocol -- I believe that Gal
+Shachor was the original designer.  Everything in this document is derived
+from the actual implementation I found in the tomcat 3.x code.  I hope it
+is useful, but I can't make any grand claims to perfect accuracy.  I also
+don't know why certain design decisions were made.  Where I was able, I've
+offered some possible justifications for certain choices, but those are
+only my guesses.  In general, the C code which Shachor wrote is very clean
+and comprehensible (if almost totally undocumented).  I've cleaned up the
+Java code, and I think it's reasonably readable.
+</p>
+<br/>
+<a name="Design Goals">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Design Goals</td>
+</tr>
+</table>
+</a>
+<p class="section">
+According to email from Gal Shachor to the jakarta-dev mailing list,
+the original goals of <b>
+<font color="#333333">JK</font>
+</b> (and thus <b>
+<font color="#333333">ajp13</font>
+</b>) were to extend
+<b>
+<font color="#333333">mod_jserv</font>
+</b> and <b>
+<font color="#333333">ajp12</font>
+</b> by (I am only including the goals which
+relate to communication between the web server and the servlet container):
+
+<ul>
+<li> Increasing performance (speed, specifically). </li>
+<li> Adding support for SSL, so that  and
+        will function correctly within the servlet
+       container.  The client certificates and cipher suite will be
+       available to servlets as request attributes. </li>
+</ul>
+</p>
+<br/>
+<a name="Overview of the protocol">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Overview of the protocol</td>
+</tr>
+</table>
+</a>
+<p class="section">
+The <b>
+<font color="#333333">ajp13</font>
+</b> protocol is packet-oriented.  A binary format was
+presumably chosen over the more readable plain text for reasons of
+performance.  The web server communicates with the servlet container over
+TCP connections.  To cut down on the expensive process of socket creation,
+the web server will attempt to maintain persistent TCP connections to the
+servlet container, and to reuse a connection for multiple request/response
+cycles.
+</p>
+<p class="section">
+Once a connection is assigned to a particular request, it will not be
+used for any others until the request-handling cycle has terminated.  In
+other words, requests are not multiplexed over connections.  This makes
+for much simpler code at either end of the connection, although it does
+cause more connections to be open at once.
+</p>
+<p class="section">
+Once the web server has opened a connection to the servlet container,
+the connection can be in one of the following states:
+</p>
+<p class="section">
+<ul>
+<li> Idle <br/> No request is being handled over this connection. </li>
+<li> Assigned <br/> The connecton is handling a specific request.</li>
+</ul>
+
+</p>
+<p class="section">
+Once a connection is assigned to handle a particular request, the basic
+request informaton (e.g. HTTP headers, etc) is sent over the connection in
+a highly condensed form (e.g. common strings are encoded as integers).
+Details of that format are below in Request Packet Structure. If there is a
+body to the request (content-length &gt; 0), that is sent in a separate
+packet immediately after.
+</p>
+<p class="section">
+At this point, the servlet container is presumably ready to start
+processing the request.  As it does so, it can send the
+following messages back to the web server:
+
+<ul>
+<li>SEND_HEADERS <br/>Send a set of headers back to the browser.</li>
+<li>SEND_BODY_CHUNK <br/>Send a chunk of body data back to the browser.</li>
+<li>GET_BODY_CHUNK <br/>Get further data from the request if it hasn't all
+  been transferred yet.  This is necessary because the packets have a fixed
+  maximum size and arbitrary amounts of data can be included the body of a
+  request (for uploaded files, for example).  (Note: this is unrelated to
+  HTTP chunked tranfer).</li>
+<li>END_RESPONSE <br/> Finish the request-handling cycle.</li>
+</ul>
+</p>
+<p class="section">
+
+Each message is accompanied by a differently formatted packet of data.  See
+Response Packet Structures below for details.
+</p>
+<br/>
+<a name="Basic Packet Structure">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Basic Packet Structure</td>
+</tr>
+</table>
+</a>
+<p class="section">
+There is a bit of an XDR heritage to this protocol, but it differs in
+lots of ways (no 4 byte alignment, for example).
+</p>
+<p class="section">
+Byte order: I am not clear about the endian-ness of the individual
+bytes.  I'm guessing the bytes are little-endian, because that's what XDR
+specifies, and I'm guessing that sys/socket library is magically making
+that so (on the C side).  If anyone with a better knowledge of socket calls
+can step in, that would be great.
+</p>
+<p class="section">
+There are four data types in the protocol: bytes, booleans, integers and
+strings.
+
+
+</p>
+<a name="sub_Packet Size">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Packet Size</td>
+</tr>
+</table>
+</a>
+<p class="section">
+According to much of the code, the max packet
+size is 8 * 1024 bytes (8K).  The actual length of the packet is encoded in the
+header.
+</p>
+<br/>
+<a name="sub_Packet Headers">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Packet Headers</td>
+</tr>
+</table>
+</a>
+<p class="section">
+Packets sent from the server to the container begin with
+<b class="code">0x1234</b>.  Packets sent from the container to the server begin
+with <b class="code">AB</b> (that's the ASCII code for A followed by the ASCII
+code for B).  After those first two bytes, there is an integer (encoded as
+above) with the length of the payload.  Although this might suggest that
+the maximum payload could be as large as 2^16, in fact, the code sets the
+maximum to be 8K.
+
+
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc" colspan="6">Packet Format (Server-&gt;Container)</td>
+</tr>
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Byte</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">1</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">2</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">3</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">4...(n+3)</td>
+</tr>
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Contents</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x12</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x34</td>
+<td align="left" valign="top" bgcolor="#a0ddf0" colspan="2">Data Length (n)</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Data</td>
+</tr>
+</table>
+
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc" colspan="6">
+<b>
+<font color="#333333">Packet Format (Container-&gt;Server)</font>
+</b>
+</td>
+</tr>
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Byte</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">1</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">2</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">3</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">4...(n+3)</td>
+</tr>
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Contents</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">A</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">B</td>
+<td align="left" valign="top" bgcolor="#a0ddf0" colspan="2">Data Length (n)</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Data</td>
+</tr>
+</table>
+</p>
+<p class="section">
+ For most packets, the first byte of the
+payload encodes the type of message.  The exception is for request body
+packets sent from the server to the container -- they are sent with a
+standard packet header (0x1234 and then length of the packet), but without
+any prefix code after that (this seems like a mistake to me).
+</p>
+<p class="section">
+The web server can send the following messages to the servlet container:
+
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Code</td>
+<td align="middle" valign="top" bgcolor="#039acc">Type of Packet</td>
+<td align="middle" valign="top" bgcolor="#039acc">Meaning</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">2</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Forward Request</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Begin the request-processing cycle with the following data</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">7</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Shutdown</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">The web server asks the container to shut itself down.</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">8</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Ping</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">The web server asks the container to take control (secure login phase).</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">10</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">CPing</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">The web server asks the container to respond quickly with a CPong.</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">none</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Data</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Size (2 bytes) and corresponding body data.</td>
+</tr>
+</table>
+</p>
+<p class="section">
+To ensure some
+basic security, the container will only actually do the <b class="code">Shutdown</b> if the
+request comes from the same machine on which it's hosted.
+</p>
+<p class="section">
+The first <b class="code">Data</b> packet is send immediatly after the <b class="code">Forward Request</b> by the web server.
+</p>
+<p class="section">The servlet container can send the following types of messages to the web
+server:
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Code</td>
+<td align="middle" valign="top" bgcolor="#039acc">Type of Packet</td>
+<td align="middle" valign="top" bgcolor="#039acc">Meaning</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">3</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Send Body Chunk</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Send a chunk of the body from the servlet container to the web
+    server (and presumably, onto the browser). </td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">4</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Send Headers</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Send the response headers from the servlet container to the web
+    server (and presumably, onto the browser).</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">5</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">End Response</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Marks the end of the response (and thus the request-handling cycle).</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">6</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Get Body Chunk</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Get further data from the request if it hasn't all been transferred
+    yet.</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">9</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">CPong Reply</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">The reply to a CPing request</td>
+</tr>
+</table>
+</p>
+<p class="section">
+Each of the above messages has a different internal structure, detailed below.
+</p>
+<br/>
+<br/>
+<a name="Request Packet Structure">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Request Packet Structure</td>
+</tr>
+</table>
+</a>
+<p class="section">
+For messages from the server to the container of type "Forward Request":
+</p>
+<p class="section">
+<pre class="section">
+AJP13_FORWARD_REQUEST :=
+    prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
+    method           (byte)
+    protocol         (string)
+    req_uri          (string)
+    remote_addr      (string)
+    remote_host      (string)
+    server_name      (string)
+    server_port      (integer)
+    is_ssl           (boolean)
+    num_headers      (integer)
+    request_headers *(req_header_name req_header_value)
+    attributes      *(attribut_name attribute_value)
+    request_terminator (byte) OxFF
+</pre>
+</p>
+<p class="section">
+The <b class="code">request_headers</b> have the following structure:
+</p>
+<p class="section">
+<pre class="section">
+req_header_name := 
+    sc_req_header_name | (string)  [see below for how this is parsed]
+
+sc_req_header_name := 0xA0xx (integer)
+
+req_header_value := (string)
+</pre>
+</p>
+<p class="section">
+
+The <b class="code">attributes</b> are optional and have the following structure:
+</p>
+<p class="section">
+<pre class="section">
+attribute_name := sc_a_name | (sc_a_req_attribute string)
+
+attribute_value := (string)
+
+</pre>
+</p>
+<p class="section">
+Not that the all-important header is "content-length', because it
+determines whether or not the container looks for another packet
+immediately.
+</p>
+<p class="section">
+Detailed description of the elements of Forward Request.
+</p>
+<a name="sub_request_prefix">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>request_prefix</td>
+</tr>
+</table>
+</a>
+<p class="section">
+For all requests, this will be 2.
+See above for details on other .
+</p>
+<br/>
+<a name="sub_method">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>method</td>
+</tr>
+</table>
+</a>
+<p class="section">
+The HTTP method, encoded as a single byte:
+</p>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Command Name</td>
+<td align="middle" valign="top" bgcolor="#039acc">Code</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">OPTIONS</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">1</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">GET</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">2</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">HEAD</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">3</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">POST</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">4</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">PUT</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">5</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">DELETE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">6</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">TRACE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">7</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">PROPFIND</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">8</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">PROPPATCH</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">9</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">MKCOL</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">10</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">COPY</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">11</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">MOVE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">12</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">LOCK</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">13</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">UNLOCK</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">14</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">ACL</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">15</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">REPORT</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">16</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">VERSION-CONTROL</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">17</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">CHECKIN</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">18</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">CHECKOUT</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">19</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">UNCHECKOUT</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">20</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">SEARCH</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">21</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">MKWORKSPACE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">22</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">UPDATE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">23</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">LABEL</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">24</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">MERGE</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">25</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">BASELINE_CONTROL</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">26</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">MKACTIVITY</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">27</td>
+</tr>
+</table>
+</p>
+<p class="section">Later version of ajp13, when used with mod_jk2, will transport 
+additional methods, even if they are not in this list.
+</p>
+<br/>
+<a name="sub_protocol, req_uri, remote_addr, remote_host, server_name, server_port, is_ssl">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>protocol, req_uri, remote_addr, remote_host, server_name, server_port, is_ssl</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  These are all fairly self-explanatory.  Each of these is required, and
+  will be sent for every request.
+</p>
+<br/>
+<a name="sub_Headers">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Headers</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  The structure of <b class="code">request_headers</b> is the following:
+  First, the number of headers <b class="code">num_headers</b> is encoded.
+  Then, a series of header name <b class="code">req_header_name</b> / value
+  <b class="code">req_header_value</b> pairs follows.
+  Common header names are encoded as integers,
+  to save space.  If the header name is not in the list of basic headers,
+  it is encoded normally (as a string, with prefixed length).  The list of
+  common headers <b class="code">sc_req_header_name</b>and their codes
+  is as follows (all are case-sensitive):
+</p>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Name</td>
+<td align="middle" valign="top" bgcolor="#039acc">Code value</td>
+<td align="middle" valign="top" bgcolor="#039acc">Code name</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">accept</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA001</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_ACCEPT</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">accept-charset</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA002</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_ACCEPT_CHARSET</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">accept-encoding</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA003</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_ACCEPT_ENCODING</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">accept-language</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA004</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_ACCEPT_LANGUAGE</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">authorization</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA005</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_AUTHORIZATION</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">connection</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA006</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_CONNECTION</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">content-type</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA007</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_CONTENT_TYPE</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">content-length</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA008</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_CONTENT_LENGTH</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">cookie</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA009</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_COOKIE</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">cookie2</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00A</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_COOKIE2</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">host</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00B</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_HOST</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">pragma</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00C</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_PRAGMA</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">referer</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00D</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_REFERER</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">user-agent</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00E</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">SC_REQ_USER_AGENT</td>
+</tr>
+</table>
+</p>
+<p class="section">
+  The Java code that reads this grabs the first two-byte integer and if
+  it sees an <b class="code">'0xA0'</b> in the most significant
+  byte, it uses the integer in the second byte as an index into an array of
+  header names.  If the first byte is not '0xA0', it assumes that the
+  two-byte integer is the length of a string, which is then read in.
+</p>
+<p class="section">
+  This works on the assumption that no header names will have length
+  greater than 0x9999 (==0xA000 - 1), which is perfectly reasonable, though
+  somewhat arbitrary. (If you, like me, started to think about the cookie
+  spec here, and about how long headers can get, fear not -- this limit is
+  on header <b>
+<font color="#333333">names</font>
+</b> not header <b>
+<font color="#333333">values</font>
+</b>.  It seems unlikely that
+  unmanageably huge header names will be showing up in the HTTP spec any time
+  soon).
+</p>
+<p class="section">
+  <b>
+<font color="#333333">Note:</font>
+</b> The <b class="code">content-length</b> header is extremely
+  important.  If it is present and non-zero, the container assumes that
+  the request has a body (a POST request, for example), and immediately
+  reads a separate packet off the input stream to get that body.
+</p>
+<br/>
+<a name="sub_Attributes">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Attributes</td>
+</tr>
+</table>
+</a>
+<p class="section">
+
+  The attributes prefixed with a <b class="code">?</b>
+  (e.g. <b class="code">?context</b>) are all optional.  For each, there is a
+  single byte code to indicate the type of attribute, and then a string to
+  give its value.  They can be sent in any order (thogh the C code always
+  sends them in the order listed below).  A special terminating code is
+  sent to signal the end of the list of optional attributes. The list of
+  byte codes is:
+</p>
+<p class="section">
+
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Information</td>
+<td align="middle" valign="top" bgcolor="#039acc">Code Value</td>
+<td align="middle" valign="top" bgcolor="#039acc">Note</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?context</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x01</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Not currently implemented</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?servlet_path</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x02</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Not currently implemented</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?remote_user</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x03</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?auth_type</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x04</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?query_string</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x05</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?jvm_route</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x06</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?ssl_cert</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x07</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?ssl_cipher</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x08</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?ssl_session</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x09</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?req_attribute</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x0A</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">Name (the name of the attribut follows)</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">?ssl_key_size</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0x0B</td>
+<td align="left" valign="top" bgcolor="#a0ddf0"/>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">are_done</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xFF</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">request_terminator</td>
+</tr>
+</table>
+
+</p>
+<p class="section">
+
+  The <b class="code">context</b> and <b class="code">servlet_path</b> are not currently
+  set by the C code, and most of the Java code completely ignores whatever
+  is sent over for those fields (and some of it will actually break if a
+  string is sent along after one of those codes).  I don't know if this is
+  a bug or an unimplemented feature or just vestigial code, but it's
+  missing from both sides of the connection.
+</p>
+<p class="section">
+  The <b class="code">remote_user</b> and <b class="code">auth_type</b> presumably refer
+  to HTTP-level authentication, and communicate the remote user's username
+  and the type of authentication used to establish their identity (e.g. Basic,
+  Digest).  I'm not clear on why the password isn't also sent, but I don't
+  know HTTP authentication inside and out.
+</p>
+<p class="section">
+  The <b class="code">query_string</b>, <b class="code">ssl_cert</b>,
+  <b class="code">ssl_cipher</b>, and <b class="code">ssl_session</b> refer to the
+  corresponding pieces of HTTP and HTTPS.
+</p>
+<p class="section">
+  The <b class="code">jvm_route</b>, as I understand it, is used to support sticky
+  sessions -- associating a user's sesson with a particular Tomcat instance
+  in the presence of multiple, load-balancing servers.  I don't know the
+  details.
+</p>
+<p class="section">
+  Beyond this list of basic attributes, any number of other attributes can
+  be sent via the <b class="code">req_attribute</b> code (0x0A).  A pair of strings
+  to represent the attribute name and value are sent immediately after each
+  instance of that code.  Environment values are passed in via this method.
+</p>
+<p class="section">
+  Finally, after all the attributes have been sent, the attribute terminator,
+  0xFF, is sent.  This signals both the end of the list of attributes and
+  also then end of the Request Packet.
+</p>
+<br/>
+<br/>
+<a name="Response Packet Structure">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Response Packet Structure</td>
+</tr>
+</table>
+</a>
+<p class="section">
+For messages which the container can send back to the server.
+
+<pre class="section">
+AJP13_SEND_BODY_CHUNK := 
+  prefix_code   3
+  chunk_length  (integer)
+  chunk        *(byte)
+
+
+AJP13_SEND_HEADERS :=
+  prefix_code       4
+  http_status_code  (integer)
+  http_status_msg   (string)
+  num_headers       (integer)
+  response_headers *(res_header_name header_value)
+
+res_header_name := 
+    sc_res_header_name | (string)   [see below for how this is parsed]
+
+sc_res_header_name := 0xA0 (byte)
+
+header_value := (string)
+
+AJP13_END_RESPONSE :=
+  prefix_code       5
+  reuse             (boolean)
+
+
+AJP13_GET_BODY_CHUNK :=
+  prefix_code       6
+  requested_length  (integer)
+</pre>
+
+</p>
+<p class="section">
+Details:
+</p>
+<a name="sub_Send Body Chunk">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Send Body Chunk</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  The chunk is basically binary data, and is sent directly back to the browser.
+</p>
+<br/>
+<a name="sub_Send Headers">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Send Headers</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  The status code and message are the usual HTTP things (e.g. "200" and "OK").
+  The response header names are encoded the same way the request header names are.
+  See  for details about how the the
+  codes are distinguished from the strings.  The codes for common headers are:
+</p>
+<p class="section">
+<table border="0">
+<tr>
+<td align="middle" valign="top" bgcolor="#039acc">Name</td>
+<td align="middle" valign="top" bgcolor="#039acc">Code value</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Content-Type</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA001</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Content-Language</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA002</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Content-Length</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA003</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Date</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA004</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Last-Modified</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA005</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Location</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA006</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Set-Cookie</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA007</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Set-Cookie2</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA008</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Servlet-Engine</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA009</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">Status</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00A</td>
+</tr>
+<tr>
+<td align="left" valign="top" bgcolor="#a0ddf0">WWW-Authenticate</td>
+<td align="left" valign="top" bgcolor="#a0ddf0">0xA00B</td>
+</tr>
+</table>
+
+</p>
+<p class="section"> 
+  After the code or the string header name, the header value is immediately
+  encoded.
+</p>
+<br/>
+<a name="sub_End Response">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>End Response</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  Signals the end of this request-handling cycle.  If the
+  <b class="code">reuse</b> flag is true (==1), this TCP connection can now be used to
+  handle new incoming requests.  If <b class="code">reuse</b> is false (anything
+  other than 1 in the actual C code), the connection should be closed.
+</p>
+<br/>
+<a name="sub_Get Body Chunk">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="subsection" bgcolor="#828DA6">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Get Body Chunk</td>
+</tr>
+</table>
+</a>
+<p class="section">
+  The container asks for more data from the request (If the body was
+  too large to fit in the first packet sent over or when the request is
+  chuncked).
+  The server will send a body packet back with an amount of data which is
+  the minimum of the <b class="code">request_length</b>,
+  the maximum send body size (8186 (8 Kbytes - 6)), and the
+  number of bytes actually left to send from the request body.
+<br/>
+  If there is no more data in the body (i.e. the servlet container is
+  trying to read past the end of the body), the server will send back an
+  "empty" packet, which is a body packet with a payload length of 0.
+  (0x12,0x34,0x00,0x00)
+</p>
+<br/>
+<br/>
+<a name="Questions I Have">
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+<tr>
+<td align="left" valign="top" class="section" bgcolor="#525D76">
+<img border="0" vspace="0" hspace="0" align="left" valign="top" src="../images/corner.gif"/>Questions I Have</td>
+</tr>
+</table>
+</a>
+<p class="section"> What happens if the request headers &gt; max packet size?  There is no
+provision to send a second packet of request headers in case there are more
+than 8K (I think this is correctly handled for response headers, though I'm
+not certain).  I don't know if there is a way to get more than 8K worth of
+data into that initial set of request headers, but I'll bet there is
+(combine long cookies with long ssl information and a lot of environment
+variables, and you should hit 8K easily).  I think the connector would just
+fail before trying to send any headers in this case, but I'm not certain.</p>
+<p class="section"> What about authentication?  There doesn't seem to be any authentication
+of the connection between the web server and the container.  This strikes
+me as potentially dangerous.</p>
+<br/>
+</td>
+</tr>
+</table>
+</body>
+</html>

Propchange: tomcat/site/trunk/docs/connectors-doc-archive/jk2/common/printer/AJPv13.html
------------------------------------------------------------------------------
    svn:executable = *



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org