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