001: /*
002: * Copyright 1999-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.jk.core;
018:
019: import java.io.IOException;
020:
021: import org.apache.tomcat.util.buf.ByteChunk;
022: import org.apache.tomcat.util.buf.MessageBytes;
023:
024: /**
025: * A single packet for communication between the web server and the
026: * container.
027: *
028: * In a more generic sense, it's the event that drives the processing chain.
029: * XXX Use Event, make Msg a particular case.
030: *
031: * @author Henri Gomez [hgomez@apache.org]
032: * @author Dan Milstein [danmil@shore.net]
033: * @author Keith Wannamaker [Keith@Wannamaker.org]
034: * @author Kevin Seguin
035: * @author Costin Manolache
036: */
037: public abstract class Msg {
038:
039: /**
040: * Prepare this packet for accumulating a message from the container to
041: * the web server. Set the write position to just after the header
042: * (but leave the length unwritten, because it is as yet unknown).
043: */
044: public abstract void reset();
045:
046: /**
047: * For a packet to be sent to the web server, finish the process of
048: * accumulating data and write the length of the data payload into
049: * the header.
050: */
051: public abstract void end();
052:
053: public abstract void appendInt(int val);
054:
055: public abstract void appendByte(int val);
056:
057: public abstract void appendLongInt(int val);
058:
059: /**
060: */
061: public abstract void appendBytes(MessageBytes mb)
062: throws IOException;
063:
064: public abstract void appendByteChunk(ByteChunk bc)
065: throws IOException;
066:
067: /**
068: * Copy a chunk of bytes into the packet, starting at the current
069: * write position. The chunk of bytes is encoded with the length
070: * in two bytes first, then the data itself, and finally a
071: * terminating \0 (which is <B>not</B> included in the encoded
072: * length).
073: *
074: * @param b The array from which to copy bytes.
075: * @param off The offset into the array at which to start copying
076: * @param len The number of bytes to copy.
077: */
078: public abstract void appendBytes(byte b[], int off, int numBytes);
079:
080: /**
081: * Read an integer from packet, and advance the read position past
082: * it. Integers are encoded as two unsigned bytes with the
083: * high-order byte first, and, as far as I can tell, in
084: * little-endian order within each byte.
085: */
086: public abstract int getInt();
087:
088: public abstract int peekInt();
089:
090: public abstract byte getByte();
091:
092: public abstract byte peekByte();
093:
094: public abstract void getBytes(MessageBytes mb);
095:
096: /**
097: * Copy a chunk of bytes from the packet into an array and advance
098: * the read position past the chunk. See appendBytes() for details
099: * on the encoding.
100: *
101: * @return The number of bytes copied.
102: */
103: public abstract int getBytes(byte dest[]);
104:
105: /**
106: * Read a 32 bits integer from packet, and advance the read position past
107: * it. Integers are encoded as four unsigned bytes with the
108: * high-order byte first, and, as far as I can tell, in
109: * little-endian order within each byte.
110: */
111: public abstract int getLongInt();
112:
113: public abstract int getHeaderLength();
114:
115: public abstract int processHeader();
116:
117: public abstract byte[] getBuffer();
118:
119: public abstract int getLen();
120:
121: public abstract void dump(String msg);
122:
123: /* -------------------- Utilities -------------------- */
124: // XXX Move to util package
125: public static String hexLine(byte buf[], int start, int len) {
126: StringBuffer sb = new StringBuffer();
127: for (int i = start; i < start + 16; i++) {
128: if (i < len + 4)
129: sb.append(hex(buf[i]) + " ");
130: else
131: sb.append(" ");
132: }
133: sb.append(" | ");
134: for (int i = start; i < start + 16 && i < len + 4; i++) {
135: if (!Character.isISOControl((char) buf[i]))
136: sb.append(new Character((char) buf[i]));
137: else
138: sb.append(".");
139: }
140: return sb.toString();
141: }
142:
143: private static String hex(int x) {
144: // if( x < 0) x=256 + x;
145: String h = Integer.toHexString(x);
146: if (h.length() == 1)
147: h = "0" + h;
148: return h.substring(h.length() - 2);
149: }
150:
151: }
|