You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Jianliang Zhao <jz...@zaplet.com> on 2002/02/04 23:26:18 UTC

Header handling bug in class org.apache.Ajp13

I enabled AJP 1.3 connector on Tomcat 4.0.1 with Netscape Server and found a NumberFormatException thrown for a HTTP request with non-standard headers. I checked out the code from module jakarta-tomcat-connectors with tag tomcat_401. After some debuging, it seems the following code is causing the problem:

method: Ajp13.decodeRequest
Between /************************/ are my comments. Would you please make this fix and let me know where to get a patched tomcat_ajp.jar file?

	    // Header names are encoded as either an integer code starting
	    // with 0xA0, or as a normal string (in which case the first
	    // two bytes are the length).
            int isc = msg.peekInt();

               /*******************************************************/
               // MY DEBUG STATEMENT
	    System.out.println("header ID: " + isc); // It happens to be 8 for a non-standard header
               /*******************************************************/

            int hId = isc & 0xFF;

	    MessageBytes vMB=null;
            isc &= 0xFF00;
            if(0xA000 == isc) {

               /*******************************************************/
               // MY DEBUG STATEMENT
                System.out.println("Integer coding: 0xA0000");
               /*******************************************************/

                msg.getInt(); // To advance the read position
                hName = headerTransArray[hId - 1];
		vMB= headers.addValue(hName);
            } else {
               /*******************************************************/
                /* This branch is executed for the normal string encoding(non-standard header case)*/
                /* The header ID is also set for the normal string encoding case */
                /* I added the following line to fix the problem */
                hId = -1; // Should we set hId to dummy number here?
                System.out.println("Normal String: 0xA0000");
               /*******************************************************/

		// XXX Not very elegant
		vMB = msg.addHeader(headers);
		if (vMB == null) {
                    return 500; // wrong packet
                }
            }

            msg.getMessageBytes(vMB);

            // set content length, if this is it...
            if (hId == SC_REQ_CONTENT_LENGTH) {
                 /*******************************************************/
                 /* Originally the following line was executed for normal string encoding if hId happens to be 8 */
                 /* It throws NumberFormatException */
                 /*******************************************************/

                 int contentLength = (vMB == null) ? -1 : vMB.getInt();

Thanks,

Jianliang

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>