ViaParser.java revision 600c7a4bbc7348167293eac928192e695b4ad5ba
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 Wangpackage gov.nist.javax.sip.parser; 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.header.*; 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Parser for via headers. 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.12 $ $Date: 2009/07/17 18:58:07 $ 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.1 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author Olivier Deruelle 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ViaParser extends HeaderParser { 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ViaParser(String via) { 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang super(via); 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public ViaParser(Lexer lexer) { 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang super(lexer); 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * a parser for the essential part of the via header. 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private void parseVia(Via v) throws ParseException { 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // The protocol 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match(TokenTypes.ID); 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token protocolName = lexer.getNextToken(); 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // consume the "/" 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match('/'); 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match(TokenTypes.ID); 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token protocolVersion = lexer.getNextToken(); 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // We consume the "/" 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match('/'); 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match(TokenTypes.ID); 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token transport = lexer.getNextToken(); 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Protocol protocol = new Protocol(); 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protocol.setProtocolName(protocolName.getTokenValue()); 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protocol.setProtocolVersion(protocolVersion.getTokenValue()); 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protocol.setTransport(transport.getTokenValue()); 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang v.setSentProtocol(protocol); 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // sent-By 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang HostNameParser hnp = new HostNameParser(this.getLexer()); 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang HostPort hostPort = hnp.hostPort( true ); 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang v.setSentBy(hostPort); 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Ignore blanks 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // parameters 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (lexer.lookAhead(0) == ';') { 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.consume(1); 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nameValue = this.nameValue(); 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String name = nameValue.getName(); 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (name.equals(Via.BRANCH)) { 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String branchId = (String) nameValue.getValueAsObject(); 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (branchId == null) 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new ParseException("null branch Id", lexer.getPtr()); 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang v.setParameter(nameValue); 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // JvB Note: RFC3261 does not allow a comment in Via headers anymore 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (lexer.lookAhead(0) == '(') { 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.selectLexer("charLexer"); 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang StringBuffer comment = new StringBuffer(); 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (true) { 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang char ch = lexer.lookAhead(0); 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (ch == ')') { 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (ch == '\\') { 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Escaped character 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token tok = lexer.getNextToken(); 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang comment.append(tok.getTokenValue()); 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang tok = lexer.getNextToken(); 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang comment.append(tok.getTokenValue()); 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (ch == '\n') { 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang comment.append(ch); 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang v.setComment(comment.toString()); 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Overrides the superclass nameValue parser because we have to tolerate 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * IPV6 addresses in the received parameter. 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected NameValue nameValue() throws ParseException { 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (debug) 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang dbg_enter("nameValue"); 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match(LexerCore.ID); 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token name = lexer.getNextToken(); 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // eat white space. 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.SPorHT(); 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang boolean quoted = false; 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang char la = lexer.lookAhead(0); 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (la == '=') { 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.consume(1); 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.SPorHT(); 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String str = null; 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (name.getTokenValue().compareToIgnoreCase(Via.RECEIVED) == 0) { 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Allow for IPV6 Addresses. 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // these could have : in them! 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang str = lexer.byteStringNoSemicolon(); 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (lexer.lookAhead(0) == '\"') { 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang str = lexer.quotedString(); 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang quoted = true; 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang lexer.match(LexerCore.ID); 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Token value = lexer.getNextToken(); 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang str = value.getTokenValue(); 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue(name.getTokenValue() 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang .toLowerCase(), str); 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (quoted) 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang nv.setQuotedValue(); 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return nv; 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return new NameValue(name.getTokenValue().toLowerCase(), 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang null); 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (ParseException ex) { 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return new NameValue(name.getTokenValue(), null); 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } finally { 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (debug) 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang dbg_leave("nameValue"); 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public SIPHeader parse() throws ParseException { 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (debug) 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang dbg_enter("parse"); 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ViaList viaList = new ViaList(); 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // The first via header. 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.match(TokenTypes.VIA); 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); // ignore blanks 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.match(':'); // expect a colon. 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); // ingore blanks. 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (true) { 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Via v = new Via(); 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang parseVia(v); 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang viaList.add(v); 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); // eat whitespace. 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.lexer.lookAhead(0) == ',') { 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.consume(1); // Consume the comma 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.SPorHT(); // Ignore space after. 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.lexer.lookAhead(0) == '\n') 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.lexer.match('\n'); 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return viaList; 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } finally { 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (debug) 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang dbg_leave("parse"); 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * public static void main(String args[]) throws ParseException { String 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * via[] = { "Via: SIP/2.0/UDP 135.180.130.133;branch=-12345\n", "Via: 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIP/2.0/UDP 166.34.120.100;branch=0000045d-00000001"+ ",SIP/2.0/UDP 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 166.35.224.216:5000\n", "Via: SIP/2.0/UDP sip33.example.com,"+ " 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIP/2.0/UDP sip32.example.com (oli),"+ "SIP/2.0/UDP sip31.example.com\n", 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "Via: SIP/2.0/UDP host.example.com;received=::133;"+ " 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * branch=C1C3344E2710000000E299E568E7potato10potato0potato0\n", "Via: 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIP/2.0/UDP host.example.com;received=135.180.130.133;"+ " 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * branch=C1C3344E2710000000E299E568E7potato10potato0potato0\n", "Via: 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIP/2.0/UDP company.com:5604 ( Hello )"+ ", SIP / 2.0 / UDP 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 135.180.130.133\n", "Via: SIP/2.0/UDP 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 129.6.55.9:7060;received=stinkbug.antd.nist.gov\n", 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "Via: SIP/2.0/UDP ss2.wcom.com:5060;branch=721e418c4.1"+ ", SIP/2.0/UDP 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * ss1.wcom.com:5060;branch=2d4790.1"+ " , SIP/2.0/UDP here.com:5060( Hello 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the big world) \n" ,"Via: SIP/2.0/UDP 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * ss1.wcom.com:5060;branch=2d4790.1\n", "Via: SIP/2.0/UDP 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * first.example.com:4000;ttl=16"+ ";maddr=224.2.0.1 ;branch=a7c6a8dlze.1 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (Acme server)\n" }; 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * for (int i = 0; i < via.length; i++ ) { ViaParser vp = new 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * ViaParser(via[i]); System.out.println("toParse = " + via[i]); ViaList vl = 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (ViaList) vp.parse(); System.out.println("encoded = " + vl.encode()); } 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * } 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 259