Class AjpMessage

java.lang.Object
org.apache.coyote.ajp.AjpMessage

public class AjpMessage extends Object
A single packet for communication between the web server and the container. Designed to be reused many times with no creation of garbage. Understands the format of data types for these packets. Can be used (somewhat confusingly) for both incoming and outgoing packets.
Author:
Henri Gomez, Dan Milstein, Keith Wannamaker, Kevin Seguin, Costin Manolache
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected final byte[]
    Fixed size buffer.
    protected int
    This actually means different things depending on whether the packet is read or write.
    protected int
    The current read or write position in the buffer.
    protected static final StringManager
    The string manager for this package.
  • Constructor Summary

    Constructors
    Constructor
    Description
    AjpMessage(int packetSize)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    appendByte(int val)
    Append a byte (1 byte) to the message.
    void
    Write a ByteChunk out at the current write position.
    void
    appendBytes(byte[] b, int off, int numBytes)
    Copy a chunk of bytes into the packet, starting at the current write position.
    void
    Copy a chunk of bytes into the packet, starting at the current write position.
    void
    Write a MessageBytes out at the current write position.
    void
    appendInt(int val)
    Add a short integer (2 bytes) to the message.
    void
    end()
    For a packet to be sent to the web server, finish the process of accumulating data and write the length of the data payload into the header.
    void
     
    byte[]
    Return the underlying byte buffer.
    byte
     
    void
     
    int
    Read an integer from packet, and advance the read position past it.
    int
    Return the current message length.
    int
    Read a 32 bits integer from packet, and advance the read position past it.
    protected static String
    hex(int x)
     
    protected static String
    hexLine(byte[] buf, int start, int len)
     
    int
     
    int
    processHeader(boolean toContainer)
     
    void
    Prepare this packet for accumulating a message from the container to the web server.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • sm

      protected static final StringManager sm
      The string manager for this package.
    • buf

      protected final byte[] buf
      Fixed size buffer.
    • pos

      protected int pos
      The current read or write position in the buffer.
    • len

      protected int len
      This actually means different things depending on whether the packet is read or write. For read, it's the length of the payload (excluding the header). For write, it's the length of the packet as a whole (counting the header). Oh, well.
  • Constructor Details

    • AjpMessage

      public AjpMessage(int packetSize)
  • Method Details

    • reset

      public void reset()
      Prepare this packet for accumulating a message from the container to the web server. Set the write position to just after the header (but leave the length unwritten, because it is as yet unknown).
    • end

      public void end()
      For a packet to be sent to the web server, finish the process of accumulating data and write the length of the data payload into the header.
    • getBuffer

      public byte[] getBuffer()
      Return the underlying byte buffer.
      Returns:
      The buffer
    • getLen

      public int getLen()
      Return the current message length.
      Returns:
      For read, it's the length of the payload (excluding the header). For write, it's the length of the packet as a whole (counting the header).
    • appendInt

      public void appendInt(int val)
      Add a short integer (2 bytes) to the message.
      Parameters:
      val - The integer to append
    • appendByte

      public void appendByte(int val)
      Append a byte (1 byte) to the message.
      Parameters:
      val - The byte value to append
    • appendBytes

      public void appendBytes(MessageBytes mb)
      Write a MessageBytes out at the current write position. A null MessageBytes is encoded as a string with length 0.
      Parameters:
      mb - The data to write
    • appendByteChunk

      public void appendByteChunk(ByteChunk bc)
      Write a ByteChunk out at the current write position. A null ByteChunk is encoded as a string with length 0.
      Parameters:
      bc - The data to write
    • appendBytes

      public void appendBytes(byte[] b, int off, int numBytes)
      Copy a chunk of bytes into the packet, starting at the current write position. The chunk of bytes is encoded with the length in two bytes first, then the data itself, and finally a terminating \0 (which is not included in the encoded length).
      Parameters:
      b - The array from which to copy bytes.
      off - The offset into the array at which to start copying
      numBytes - The number of bytes to copy.
    • appendBytes

      public void appendBytes(ByteBuffer b)
      Copy a chunk of bytes into the packet, starting at the current write position. The chunk of bytes is encoded with the length in two bytes first, then the data itself, and finally a terminating \0 (which is not included in the encoded length).
      Parameters:
      b - The ByteBuffer from which to copy bytes.
    • getInt

      public int getInt()
      Read an integer from packet, and advance the read position past it. Integers are encoded as two unsigned bytes with the high-order byte first, and, as far as I can tell, in little-endian order within each byte.
      Returns:
      The integer value read from the message
    • peekInt

      public int peekInt()
    • getByte

      public byte getByte()
    • getBytes

      public void getBytes(MessageBytes mb)
    • getBodyBytes

      public void getBodyBytes(MessageBytes mb)
    • getLongInt

      public int getLongInt()
      Read a 32 bits integer from packet, and advance the read position past it. Integers are encoded as four unsigned bytes with the high-order byte first, and, as far as I can tell, in little-endian order within each byte.
      Returns:
      The long value read from the message
    • processHeader

      public int processHeader(boolean toContainer)
    • hexLine

      protected static String hexLine(byte[] buf, int start, int len)
    • hex

      protected static String hex(int x)