147 lines
5.1 KiB
Java
147 lines
5.1 KiB
Java
/*
|
|
* Conditions Of Use
|
|
*
|
|
* This software was developed by employees of the National Institute of
|
|
* Standards and Technology (NIST), an agency of the Federal Government.
|
|
* Pursuant to title 15 Untied States Code Section 105, works of NIST
|
|
* employees are not subject to copyright protection in the United States
|
|
* and are considered to be in the public domain. As a result, a formal
|
|
* license is not needed to use the software.
|
|
*
|
|
* This software is provided by NIST as a service and is expressly
|
|
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
|
|
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
|
|
* AND DATA ACCURACY. NIST does not warrant or make any representations
|
|
* regarding the use of the software or the results thereof, including but
|
|
* not limited to the correctness, accuracy, reliability or usefulness of
|
|
* the software.
|
|
*
|
|
* Permission to use this software is contingent upon your acceptance
|
|
* of the terms of this agreement
|
|
*
|
|
* .
|
|
*
|
|
*/
|
|
package gov.nist.javax.sip.parser;
|
|
|
|
import gov.nist.core.Token;
|
|
import gov.nist.javax.sip.header.*;
|
|
import java.text.ParseException;
|
|
|
|
/**
|
|
* Parser for UserAgent header.
|
|
*
|
|
* @version 1.2 $Revision: 1.15 $ $Date: 2009/07/17 18:58:07 $
|
|
*
|
|
* @author Olivier Deruelle <br/>
|
|
* @author M. Ranganathan <br/>
|
|
*
|
|
*
|
|
*/
|
|
public class UserAgentParser extends HeaderParser {
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param userAgent -
|
|
* UserAgent header to parse
|
|
*/
|
|
public UserAgentParser(String userAgent) {
|
|
super(userAgent);
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param lexer -
|
|
* the lexer to use.
|
|
*/
|
|
protected UserAgentParser(Lexer lexer) {
|
|
super(lexer);
|
|
}
|
|
|
|
/**
|
|
* parse the message. Note that we have losened up on the parsing quite a bit because
|
|
* user agents tend to be very bad about specifying the user agent according to RFC.
|
|
*
|
|
* @return SIPHeader (UserAgent object)
|
|
* @throws SIPParseException
|
|
* if the message does not respect the spec.
|
|
*/
|
|
public SIPHeader parse() throws ParseException {
|
|
if (debug)
|
|
dbg_enter("UserAgentParser.parse");
|
|
UserAgent userAgent = new UserAgent();
|
|
try {
|
|
headerName(TokenTypes.USER_AGENT);
|
|
if (this.lexer.lookAhead(0) == '\n')
|
|
throw createParseException("empty header");
|
|
|
|
/*
|
|
* BNF User-Agent = "User-Agent" HCOLON server-val *(LWS server-val)
|
|
* server-val = product / comment product = token [SLASH
|
|
* product-version] product-version = token
|
|
*/
|
|
while (this.lexer.lookAhead(0) != '\n'
|
|
&& this.lexer.lookAhead(0) != '\0') {
|
|
|
|
if (this.lexer.lookAhead(0) == '(') {
|
|
String comment = this.lexer.comment();
|
|
userAgent.addProductToken('(' + comment + ')');
|
|
} else {
|
|
// product = token [SLASHproduct-version]
|
|
// product-version = token
|
|
// The RFC Does NOT allow this space but we are generous in what we accept
|
|
|
|
this.getLexer().SPorHT();
|
|
|
|
|
|
String product = this.lexer.byteStringNoSlash();
|
|
if ( product == null ) throw createParseException("Expected product string");
|
|
|
|
StringBuffer productSb = new StringBuffer(product);
|
|
// do we possibily have the optional product-version?
|
|
if (this.lexer.peekNextToken().getTokenType() == TokenTypes.SLASH) {
|
|
// yes
|
|
this.lexer.match(TokenTypes.SLASH);
|
|
// product-version
|
|
// The RFC Does NOT allow this space but we are generous in what we accept
|
|
this.getLexer().SPorHT();
|
|
|
|
String productVersion = this.lexer.byteStringNoSlash();
|
|
|
|
if ( productVersion == null ) throw createParseException("Expected product version");
|
|
|
|
productSb.append("/");
|
|
|
|
productSb.append(productVersion);
|
|
}
|
|
|
|
userAgent.addProductToken(productSb.toString());
|
|
}
|
|
// LWS
|
|
this.lexer.SPorHT();
|
|
}
|
|
} finally {
|
|
if (debug)
|
|
dbg_leave("UserAgentParser.parse");
|
|
}
|
|
|
|
return userAgent;
|
|
}
|
|
|
|
|
|
public static void main(String args[]) throws ParseException { String
|
|
userAgent[] = { "User-Agent: Softphone/Beta1.5 \n", "User-Agent:Nist/Beta1 (beta version) \n", "User-Agent: Nist UA (beta version)\n",
|
|
"User-Agent: Nist1.0/Beta2 Ubi/vers.1.0 (very cool) \n" ,
|
|
"User-Agent: SJphone/1.60.299a/L (SJ Labs)\n",
|
|
"User-Agent: sipXecs/3.5.11 sipXecs/sipxbridge (Linux)\n"};
|
|
|
|
for (int i = 0; i < userAgent.length; i++ ) { UserAgentParser parser =
|
|
new UserAgentParser(userAgent[i]); UserAgent ua= (UserAgent)
|
|
parser.parse(); System.out.println("encoded = " + ua.encode()); }
|
|
}
|
|
|
|
}
|