1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD)       *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.parser;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Lamine Brahimi and Yann Duponchel (IBM Zurich) noticed that the parser was
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * blocking so I threw out some cool pipelining which ran fast but only worked
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * when the phase of the moon matched its mood. Now things are serialized and
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * life goes slower but more reliably.
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*;
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.message.*;
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.*;
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException;
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.*;
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This implements a pipelined message parser suitable for use with a stream -
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * oriented input such as TCP. The client uses this class by instatiating with
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * an input stream from which input is read and fed to a message parser. It
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * keeps reading from the input stream and process messages in a never ending
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * interpreter loop. The message listener interface gets called for processing
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * messages or for processing errors. The payload specified by the
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * content-length header is read directly from the input stream. This can be
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * accessed from the SIPMessage using the getContent and getContentBytes methods
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided by the SIPMessage class.
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.23 $ $Date: 2009/08/16 17:28:28 $
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see SIPMessageListener
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic final class PipelinedMsgParser implements Runnable {
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * The message listener that is registered with this parser. (The message
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * listener has methods that can process correct and erroneous messages.)
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected SIPMessageListener sipMessageListener;
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private Thread mythread; // Preprocessor thread
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    //private byte[] messageBody;
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    //private boolean errorFlag;
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private Pipeline rawInputStream;
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private int maxMessageSize;
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private int sizeCounter;
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    //private int messageSize;
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * default constructor.
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected PipelinedMsgParser() {
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super();
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static int uid = 0;
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static synchronized int getNewUid() {
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return uid++;
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Constructor when we are given a message listener and an input stream
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * (could be a TCP connection or a file)
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param sipMessageListener
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Message listener which has methods that get called back from
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            the parser when a parse is complete
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param in
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Input stream from which to read the input.
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param debug
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            Enable/disable tracing or lexical analyser switch.
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public PipelinedMsgParser(SIPMessageListener sipMessageListener,
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Pipeline in, boolean debug, int maxMessageSize) {
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this();
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.sipMessageListener = sipMessageListener;
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        rawInputStream = in;
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.maxMessageSize = maxMessageSize;
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        mythread = new Thread(this);
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        mythread.setName("PipelineThread-" + getNewUid());
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This is the constructor for the pipelined parser.
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param mhandler
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            a SIPMessageListener implementation that provides the message
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            handlers to handle correctly and incorrectly parsed messages.
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param in
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            An input stream to read messages from.
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public PipelinedMsgParser(SIPMessageListener mhandler, Pipeline in,
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            int maxMsgSize) {
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this(mhandler, in, false, maxMsgSize);
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This is the constructor for the pipelined parser.
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param in -
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            An input stream to read messages from.
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public PipelinedMsgParser(Pipeline in) {
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this(null, in, false, 0);
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Start reading and processing input.
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void processInput() {
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        mythread.start();
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Create a new pipelined parser from an existing one.
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return A new pipelined parser that reads from the same input stream.
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected Object clone() {
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        PipelinedMsgParser p = new PipelinedMsgParser();
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        p.rawInputStream = this.rawInputStream;
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        p.sipMessageListener = this.sipMessageListener;
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Thread mythread = new Thread(p);
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        mythread.setName("PipelineThread");
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return p;
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Add a class that implements a SIPMessageListener interface whose methods
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * get called * on successful parse and error conditons.
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param mlistener
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            a SIPMessageListener implementation that can react to correct
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *            and incorrect pars.
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setMessageListener(SIPMessageListener mlistener) {
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sipMessageListener = mlistener;
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * read a line of input (I cannot use buffered reader because we may need to
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * switch encodings mid-stream!
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private String readLine(InputStream inputStream) throws IOException {
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        StringBuffer retval = new StringBuffer("");
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        while (true) {
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            char ch;
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            int i = inputStream.read();
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (i == -1) {
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                throw new IOException("End of stream");
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            } else
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                ch = (char) i;
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            // reduce the available read size by 1 ("size" of a char).
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (this.maxMessageSize > 0) {
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                this.sizeCounter--;
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (this.sizeCounter <= 0)
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    throw new IOException("Max size exceeded!");
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (ch != '\r')
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                retval.append(ch);
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (ch == '\n') {
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                break;
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval.toString();
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * This is input reading thread for the pipelined parser. You feed it input
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * through the input stream (see the constructor) and it calls back an event
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * listener interface for message processing or error. It cleans up the
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * input - dealing with things like line continuation
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void run() {
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Pipeline inputStream = this.rawInputStream;
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // inputStream = new MyFilterInputStream(this.rawInputStream);
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // I cannot use buffered reader here because we may need to switch
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // encodings to read the message body.
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        try {
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            while (true) {
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                this.sizeCounter = this.maxMessageSize;
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // this.messageSize = 0;
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                StringBuffer inputBuffer = new StringBuffer();
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (Debug.parserDebug)
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    Debug.println("Starting parse!");
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                String line1;
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                String line2 = null;
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                while (true) {
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    try {
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        line1 = readLine(inputStream);
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // ignore blank lines.
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        if (line1.equals("\n")) {
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            if (Debug.parserDebug) {
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                Debug.println("Discarding blank line. ");
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            }
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            continue;
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        } else
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            break;
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    } catch (IOException ex) {
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        Debug.printStackTrace(ex);
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        this.rawInputStream.stopTimer();
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        return;
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                inputBuffer.append(line1);
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // Guard against bad guys.
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                this.rawInputStream.startTimer();
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                Debug.println("Reading Input Stream");
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                while (true) {
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    try {
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        line2 = readLine(inputStream);
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        inputBuffer.append(line2);
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        if (line2.trim().equals(""))
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            break;
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    } catch (IOException ex) {
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        this.rawInputStream.stopTimer();
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        Debug.printStackTrace(ex);
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        return;
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // Stop the timer that will kill the read.
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                this.rawInputStream.stopTimer();
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                inputBuffer.append(line2);
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                StringMsgParser smp = new StringMsgParser(sipMessageListener);
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                smp.readBody = false;
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                SIPMessage sipMessage = null;
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                try {
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    if (Debug.debug) {
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        Debug.println("About to parse : " + inputBuffer.toString());
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    sipMessage = smp.parseSIPMessage(inputBuffer.toString());
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    if (sipMessage == null) {
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        this.rawInputStream.stopTimer();
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        continue;
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                } catch (ParseException ex) {
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    // Just ignore the parse exception.
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    Debug.logError("Detected a parse error", ex);
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    continue;
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (Debug.debug) {
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    Debug.println("Completed parsing message");
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                ContentLength cl = (ContentLength) sipMessage
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        .getContentLength();
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                int contentLength = 0;
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (cl != null) {
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    contentLength = cl.getContentLength();
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                } else {
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    contentLength = 0;
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (Debug.debug) {
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    Debug.println("contentLength " + contentLength);
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (contentLength == 0) {
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    sipMessage.removeContent();
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                } else if (maxMessageSize == 0
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        || contentLength < this.sizeCounter) {
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    byte[] message_body = new byte[contentLength];
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    int nread = 0;
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    while (nread < contentLength) {
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // Start my starvation timer.
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // This ensures that the other end
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // writes at least some data in
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // or we will close the pipe from
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // him. This prevents DOS attack
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // that takes up all our connections.
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        this.rawInputStream.startTimer();
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        try {
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            int readlength = inputStream.read(message_body,
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                    nread, contentLength - nread);
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            if (readlength > 0) {
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                nread += readlength;
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            } else {
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                break;
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            }
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        } catch (IOException ex) {
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            Debug.logError("Exception Reading Content",ex);
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            break;
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        } finally {
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            // Stop my starvation timer.
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                            this.rawInputStream.stopTimer();
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        }
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    sipMessage.setMessageContent(message_body);
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // Content length too large - process the message and
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                // return error from there.
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (sipMessageListener != null) {
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    try {
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        sipMessageListener.processMessage(sipMessage);
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    } catch (Exception ex) {
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // fatal error in processing - close the
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        // connection.
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        break;
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } finally {
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            try {
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                inputStream.close();
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            } catch (IOException e) {
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                InternalErrorHandler.handleException(e);
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void close() {
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        try {
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.rawInputStream.close();
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } catch (IOException ex) {
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            // Ignore.
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * $Log: PipelinedMsgParser.java,v $
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.23  2009/08/16 17:28:28  mranga
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:  208
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Add authentication mechanism that uses H(username:domain:password)
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.22  2009/07/17 18:58:02  emcho
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Converts indentation tabs to spaces so that we have a uniform indentation policy in the whole project.
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.21  2008/05/24 04:10:01  mranga
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number:   158
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Obtained from:
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by:
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Reviewed by:   mranga
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Deliver tx timeout for Canceled INVITE. Fix pipeline thread exit.
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.20  2008/05/22 19:38:07  jbemmel
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Fix for issue 149: the logic wasn't always closing the internal socket pipe,
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * causing the pipe reader thread to block indefinitely
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Repeatedly starting/stopping the stack then gives hanging threads
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.19 2007/01/28 13:06:21 mranga
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Issue number: 99 Obtained from: Submitted by: Reviewed by: mranga
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Fixed PRACK handling null pointer exception (for proxy case) and cleanup of
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * unused variables.
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number: CVS: If this change addresses one or more issues, CVS:
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * then enter the issue number(s) here. CVS: Obtained from: CVS: If this change
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * has been taken from another system, CVS: then name the system in this line,
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * otherwise delete it. CVS: Submitted by: CVS: If this code has been
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * contributed to the project by someone else; i.e., CVS: they sent us a patch
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * or a set of diffs, then include their name/email CVS: address here. If this
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is your work then delete this line. CVS: Reviewed by: CVS: If we are doing
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * pre-commit code reviews and someone else has CVS: reviewed your changes,
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * include their name(s) here. CVS: If you have not had it reviewed then delete
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * this line.
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.18 2006/07/13 09:02:10 mranga Issue number: Obtained from:
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by: jeroen van bemmel Reviewed by: mranga Moved some changes from
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * jain-sip-1.2 to java.net
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number: CVS: If this change addresses one or more issues, CVS:
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * then enter the issue number(s) here. CVS: Obtained from: CVS: If this change
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * has been taken from another system, CVS: then name the system in this line,
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * otherwise delete it. CVS: Submitted by: CVS: If this code has been
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * contributed to the project by someone else; i.e., CVS: they sent us a patch
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * or a set of diffs, then include their name/email CVS: address here. If this
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is your work then delete this line. CVS: Reviewed by: CVS: If we are doing
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * pre-commit code reviews and someone else has CVS: reviewed your changes,
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * include their name(s) here. CVS: If you have not had it reviewed then delete
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * this line.
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.4 2006/06/19 06:47:27 mranga javadoc fixups
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.3 2006/06/17 10:18:14 mranga Added some synchronization to the
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * sequence number checking. Small javadoc fixups
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.2 2006/06/16 15:26:28 mranga Added NIST disclaimer to all public
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * domain files. Clean up some javadoc. Fixed a leak
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.1.1.1 2005/10/04 17:12:35 mranga
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Import
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.16 2004/11/30 23:28:14 mranga Issue number: 44 Submitted by: Rob
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Daugherty Reviewed by: M. Ranganathan
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * TCP Pipelining truncates content when other end of pipe is closed.
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.15 2004/05/30 18:55:56 mranga Reviewed by: mranga Move to timers
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and eliminate the Transaction scanner Thread to improve scalability and
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * reduce cpu usage.
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.14 2004/05/16 14:13:22 mranga Reviewed by: mranga Fixed the
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * use-count issue reported by Peter Parnes. Added property to prevent against
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * content-length dos attacks.
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.13 2004/03/19 04:22:22 mranga Reviewed by: mranga Added IO Pacing
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * for long writes - split write into chunks and flush after each chunk to avoid
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * socket back pressure.
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.12 2004/03/18 22:01:19 mranga Reviewed by: mranga Get rid of the
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * PipedInputStream from pipelined parser to avoid a copy.
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.11 2004/03/07 22:25:23 mranga Reviewed by: mranga Added a new
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * configuration parameter that instructs the stack to drop a server connection
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * after server transaction termination set
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * gov.nist.javax.sip.CACHE_SERVER_CONNECTIONS=false for this Default behavior
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is true.
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.10 2004/02/29 15:32:58 mranga Reviewed by: mranga bug fixes on
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * limiting the max message size.
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.9 2004/02/29 00:46:34 mranga Reviewed by: mranga Added new
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * configuration property to limit max message size for TCP transport. The
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * property is gov.nist.javax.sip.MAX_MESSAGE_SIZE
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.8 2004/02/25 21:43:03 mranga Reviewed by: mranga Added a couple of
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * todo's and removed some debug printlns that could slow code down by a bit.
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.7 2004/02/25 20:52:46 mranga Reviewed by: mranga Fix TCP transport
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * so messages in excess of 8192 bytes are accepted.
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.6 2004/01/22 18:39:41 mranga Reviewed by: M. Ranganathan Moved the
481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * ifdef SIMULATION and associated tags to the first column so Prep preprocessor
482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * can deal with them.
483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.5 2004/01/22 14:23:45 mranga Reviewed by: mranga Fixed some minor
485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * formatting issues.
486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Revision 1.4 2004/01/22 13:26:31 sverker Issue number: Obtained from:
488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Submitted by: sverker Reviewed by: mranga
489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Major reformat of code to conform with style guide. Resolved compiler and
491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * javadoc warnings. Added CVS tags.
492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: ----------------------------------------------------------------------
494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CVS: Issue number: CVS: If this change addresses one or more issues, CVS:
495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * then enter the issue number(s) here. CVS: Obtained from: CVS: If this change
496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * has been taken from another system, CVS: then name the system in this line,
497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * otherwise delete it. CVS: Submitted by: CVS: If this code has been
498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * contributed to the project by someone else; i.e., CVS: they sent us a patch
499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * or a set of diffs, then include their name/email CVS: address here. If this
500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is your work then delete this line. CVS: Reviewed by: CVS: If we are doing
501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * pre-commit code reviews and someone else has CVS: reviewed your changes,
502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * include their name(s) here. CVS: If you have not had it reviewed then delete
503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * this line.
504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
506