2 Replies Latest reply on Oct 5, 2007 10:38 AM by Diego Apollonio

    AJP Flush Packet causing text/plain output

    Lawrence Reisler Newbie

      We recently switched our development JBOSS instance from 4.05GA to 4.21GA, where we are have been using mod_jk for connecting an Apache front end server (2.2) to the Tomcat AppServer. We have noticed periodic times when the apache web server will return data with a content-type of plain/text (the server default) instead of the real content-type, and a chunked encoding (even if the AppServer was producing a non-chunked content). We tried switch to mod_proxy_ajp, but got the same result.

      A bit of sleuthing (2 days X 2 engineers) revealed that the AJP connection on Tomcat is sending a SEND_BODY_CHUNK (which I assume is a flush packet) periodically that seem to be confusing mod_jk. We can see in the mod_jk and mod_proxy_ajp debug log that the correct headers are coming from the Tomcat server. However, it seems like mod_jk and mod_proxy_ajp are losing all the header information regarding the packet (including the Powered by headers, content-type, content-length, cookies, etc.).

      In normal operation, for a sample small transaction, we would see this sequence in response:

      When the output would come out as text/plain, we would see this sequence:

      The question is, has something changed between JBOSS versions and is there some way to fix this problem?

        • 1. Re: AJP Flush Packet causing text/plain output
          Lawrence Reisler Newbie

          An update:

          I neglected to note that I think the reason this flush buffer upsets Apache is that Apache is forced to flush a response without any of the header information from Tomcat. So it uses the default type, and chunked encoding (because it doesn't know the length), and can't send any of the other headers.

          In despeartion, I created a patch to mod_jk 1.2.25 that seems to solve the symptom:
          diff jk_ajp_common.c jk_ajp_common.orig
          < // Removing extra flush buffer if we do not need it.
          < if (headeratclient == JK_FALSE) {
          < int code = (int)jk_b_pget_byte(op->reply,0);
          < unsigned int len = (unsigned int)jk_b_pget_int(op->reply,1);
          < if ((code == JK_AJP13_SEND_BODY_CHUNK) && (len == 0)) {
          < jk_log(l, JK_LOG_DEBUG, "Received flushbuffer -- ignoring");
          < continue;
          < }
          < }

          This might be a good check to have in mod_jk regardless, but there is still the issue as to whether Tomcat should be sending this at all.

          • 2. Re: AJP Flush Packet causing text/plain output
            Diego Apollonio Newbie

            We have encurred in the same problem you have described
            Our environment is composed by two JBoss 4.2.1 GA instances and one Apache web server version 2.0.59 connected by mod_jk version 1.2.23, all running on Linux machines.
            We found this problem for the first time moving from the previous JBoss version, the 4.0.5 GA to the 4.2.1 GA.
            The problem is that the browser randomly doesn't receive all the http headers, especially cookies and content type are dropped.
            We have found this problem initially by using Firefox , because IE doesn't care too much of the wrong content type (text/plain instead of text/html, text/javascript, ...).
            We've used the tool org.apache.soap.util.net.TcpTunnelGui to inspect the http traffic between the browser and the web server and we saw that some headers were dropped.
            We've analyzed so the network traffic between the web server and the jboss servers and it seems that the content type header is correctly sent by jboss.

            Reading on http://www.mail-archive.com/users@tomcat.apache.org/msg35199.html your starting thread we discovered that this problem has been recognized in the mod_jk component of the apache tomcat.
            Especially we found this link http://issues.apache.org/bugzilla/show_bug.cgi?id=43478 were there you can find a patch for this problem in file connectors/jk/java/org/apache/jk/core/MsgContext.java
            We know that jboss integrates a derived work of tomcat for the serlvet/jsp component, but I was unable to find this class in the sources of JBoss.
            We would like to port this fix also in the JBoss Application Server, but we was unable to find the whole org/apache/jk package.
            Does anyone tried to do this?
            Any suggestion is appreciated.