1 Reply Latest reply on Sep 25, 2007 6:09 AM by reisler

    AJP Flush Packet causing text/plain output

    reisler

      I actually posted this in the Web Server forum, but in retrospect, this forum might be more appropriate.

      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:
      SEND_HEADERS
      SEND_BODY_CHUNK
      END_RESPONSE

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

      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
          reisler

          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
          1742,1751d1741
          < // 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.