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