325 lines
16 KiB
Java
325 lines
16 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.*;
|
|
|
|
import gov.nist.javax.sip.header.extensions.*;
|
|
|
|
import gov.nist.javax.sip.header.ims.*;
|
|
|
|
import javax.sip.header.*;
|
|
import java.util.Hashtable;
|
|
|
|
/**
|
|
* Lexer class for the parser.
|
|
*
|
|
* @version 1.2
|
|
*
|
|
* @author M. Ranganathan <br/>
|
|
*
|
|
*
|
|
*/
|
|
public class Lexer extends LexerCore {
|
|
/**
|
|
* get the header name of the line
|
|
*
|
|
* @return the header name (stuff before the :) bug fix submitted by
|
|
* zvali@dev.java.net
|
|
*/
|
|
public static String getHeaderName(String line) {
|
|
if (line == null)
|
|
return null;
|
|
String headerName = null;
|
|
try {
|
|
int begin = line.indexOf(":");
|
|
headerName = null;
|
|
if (begin >= 1)
|
|
headerName = line.substring(0, begin).trim();
|
|
} catch (IndexOutOfBoundsException e) {
|
|
return null;
|
|
}
|
|
return headerName;
|
|
}
|
|
|
|
public Lexer(String lexerName, String buffer) {
|
|
super(lexerName, buffer);
|
|
this.selectLexer(lexerName);
|
|
}
|
|
|
|
/**
|
|
* get the header value of the line
|
|
*
|
|
* @return String
|
|
*/
|
|
public static String getHeaderValue(String line) {
|
|
if (line == null)
|
|
return null;
|
|
String headerValue = null;
|
|
try {
|
|
int begin = line.indexOf(":");
|
|
headerValue = line.substring(begin + 1);
|
|
} catch (IndexOutOfBoundsException e) {
|
|
return null;
|
|
}
|
|
return headerValue;
|
|
}
|
|
|
|
public void selectLexer(String lexerName) {
|
|
synchronized (lexerTables) {
|
|
// Synchronization Bug fix by Robert Rosen.
|
|
currentLexer = (Hashtable) lexerTables.get(lexerName);
|
|
this.currentLexerName = lexerName;
|
|
if (currentLexer == null) {
|
|
addLexer(lexerName);
|
|
if (lexerName.equals("method_keywordLexer")) {
|
|
addKeyword(TokenNames.REGISTER, TokenTypes.REGISTER);
|
|
addKeyword(TokenNames.ACK, TokenTypes.ACK);
|
|
addKeyword(TokenNames.OPTIONS, TokenTypes.OPTIONS);
|
|
addKeyword(TokenNames.BYE, TokenTypes.BYE);
|
|
addKeyword(TokenNames.INVITE, TokenTypes.INVITE);
|
|
addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
|
|
addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
|
|
addKeyword(TokenNames.SUBSCRIBE, TokenTypes.SUBSCRIBE);
|
|
addKeyword(TokenNames.NOTIFY, TokenTypes.NOTIFY);
|
|
addKeyword(TokenNames.MESSAGE, TokenTypes.MESSAGE);
|
|
|
|
// JvB: added to support RFC3903
|
|
addKeyword(TokenNames.PUBLISH, TokenTypes.PUBLISH);
|
|
|
|
} else if (lexerName.equals("command_keywordLexer")) {
|
|
addKeyword(ErrorInfoHeader.NAME.toUpperCase(),
|
|
TokenTypes.ERROR_INFO);
|
|
addKeyword(AllowEventsHeader.NAME.toUpperCase(),
|
|
TokenTypes.ALLOW_EVENTS);
|
|
addKeyword(AuthenticationInfoHeader.NAME.toUpperCase(),
|
|
TokenTypes.AUTHENTICATION_INFO);
|
|
addKeyword(EventHeader.NAME.toUpperCase(), TokenTypes.EVENT);
|
|
addKeyword(MinExpiresHeader.NAME.toUpperCase(),
|
|
TokenTypes.MIN_EXPIRES);
|
|
addKeyword(RSeqHeader.NAME.toUpperCase(), TokenTypes.RSEQ);
|
|
addKeyword(RAckHeader.NAME.toUpperCase(), TokenTypes.RACK);
|
|
addKeyword(ReasonHeader.NAME.toUpperCase(),
|
|
TokenTypes.REASON);
|
|
addKeyword(ReplyToHeader.NAME.toUpperCase(),
|
|
TokenTypes.REPLY_TO);
|
|
addKeyword(SubscriptionStateHeader.NAME.toUpperCase(),
|
|
TokenTypes.SUBSCRIPTION_STATE);
|
|
addKeyword(TimeStampHeader.NAME.toUpperCase(),
|
|
TokenTypes.TIMESTAMP);
|
|
addKeyword(InReplyToHeader.NAME.toUpperCase(),
|
|
TokenTypes.IN_REPLY_TO);
|
|
addKeyword(MimeVersionHeader.NAME.toUpperCase(),
|
|
TokenTypes.MIME_VERSION);
|
|
addKeyword(AlertInfoHeader.NAME.toUpperCase(),
|
|
TokenTypes.ALERT_INFO);
|
|
addKeyword(FromHeader.NAME.toUpperCase(), TokenTypes.FROM);
|
|
addKeyword(ToHeader.NAME.toUpperCase(), TokenTypes.TO);
|
|
addKeyword(ReferToHeader.NAME.toUpperCase(),
|
|
TokenTypes.REFER_TO);
|
|
addKeyword(ViaHeader.NAME.toUpperCase(), TokenTypes.VIA);
|
|
addKeyword(UserAgentHeader.NAME.toUpperCase(),
|
|
TokenTypes.USER_AGENT);
|
|
addKeyword(ServerHeader.NAME.toUpperCase(),
|
|
TokenTypes.SERVER);
|
|
addKeyword(AcceptEncodingHeader.NAME.toUpperCase(),
|
|
TokenTypes.ACCEPT_ENCODING);
|
|
addKeyword(AcceptHeader.NAME.toUpperCase(),
|
|
TokenTypes.ACCEPT);
|
|
addKeyword(AllowHeader.NAME.toUpperCase(), TokenTypes.ALLOW);
|
|
addKeyword(RouteHeader.NAME.toUpperCase(), TokenTypes.ROUTE);
|
|
addKeyword(AuthorizationHeader.NAME.toUpperCase(),
|
|
TokenTypes.AUTHORIZATION);
|
|
addKeyword(ProxyAuthorizationHeader.NAME.toUpperCase(),
|
|
TokenTypes.PROXY_AUTHORIZATION);
|
|
addKeyword(RetryAfterHeader.NAME.toUpperCase(),
|
|
TokenTypes.RETRY_AFTER);
|
|
addKeyword(ProxyRequireHeader.NAME.toUpperCase(),
|
|
TokenTypes.PROXY_REQUIRE);
|
|
addKeyword(ContentLanguageHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTENT_LANGUAGE);
|
|
addKeyword(UnsupportedHeader.NAME.toUpperCase(),
|
|
TokenTypes.UNSUPPORTED);
|
|
addKeyword(SupportedHeader.NAME.toUpperCase(),
|
|
TokenTypes.SUPPORTED);
|
|
addKeyword(WarningHeader.NAME.toUpperCase(),
|
|
TokenTypes.WARNING);
|
|
addKeyword(MaxForwardsHeader.NAME.toUpperCase(),
|
|
TokenTypes.MAX_FORWARDS);
|
|
addKeyword(DateHeader.NAME.toUpperCase(), TokenTypes.DATE);
|
|
addKeyword(PriorityHeader.NAME.toUpperCase(),
|
|
TokenTypes.PRIORITY);
|
|
addKeyword(ProxyAuthenticateHeader.NAME.toUpperCase(),
|
|
TokenTypes.PROXY_AUTHENTICATE);
|
|
addKeyword(ContentEncodingHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTENT_ENCODING);
|
|
addKeyword(ContentLengthHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTENT_LENGTH);
|
|
addKeyword(SubjectHeader.NAME.toUpperCase(),
|
|
TokenTypes.SUBJECT);
|
|
addKeyword(ContentTypeHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTENT_TYPE);
|
|
addKeyword(ContactHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTACT);
|
|
addKeyword(CallIdHeader.NAME.toUpperCase(),
|
|
TokenTypes.CALL_ID);
|
|
addKeyword(RequireHeader.NAME.toUpperCase(),
|
|
TokenTypes.REQUIRE);
|
|
addKeyword(ExpiresHeader.NAME.toUpperCase(),
|
|
TokenTypes.EXPIRES);
|
|
addKeyword(RecordRouteHeader.NAME.toUpperCase(),
|
|
TokenTypes.RECORD_ROUTE);
|
|
addKeyword(OrganizationHeader.NAME.toUpperCase(),
|
|
TokenTypes.ORGANIZATION);
|
|
addKeyword(CSeqHeader.NAME.toUpperCase(), TokenTypes.CSEQ);
|
|
addKeyword(AcceptLanguageHeader.NAME.toUpperCase(),
|
|
TokenTypes.ACCEPT_LANGUAGE);
|
|
addKeyword(WWWAuthenticateHeader.NAME.toUpperCase(),
|
|
TokenTypes.WWW_AUTHENTICATE);
|
|
addKeyword(CallInfoHeader.NAME.toUpperCase(),
|
|
TokenTypes.CALL_INFO);
|
|
addKeyword(ContentDispositionHeader.NAME.toUpperCase(),
|
|
TokenTypes.CONTENT_DISPOSITION);
|
|
// And now the dreaded short forms....
|
|
addKeyword(TokenNames.K.toUpperCase(), TokenTypes.SUPPORTED);
|
|
addKeyword(TokenNames.C.toUpperCase(),
|
|
TokenTypes.CONTENT_TYPE);
|
|
addKeyword(TokenNames.E.toUpperCase(),
|
|
TokenTypes.CONTENT_ENCODING);
|
|
addKeyword(TokenNames.F.toUpperCase(), TokenTypes.FROM);
|
|
addKeyword(TokenNames.I.toUpperCase(), TokenTypes.CALL_ID);
|
|
addKeyword(TokenNames.M.toUpperCase(), TokenTypes.CONTACT);
|
|
addKeyword(TokenNames.L.toUpperCase(),
|
|
TokenTypes.CONTENT_LENGTH);
|
|
addKeyword(TokenNames.S.toUpperCase(), TokenTypes.SUBJECT);
|
|
addKeyword(TokenNames.T.toUpperCase(), TokenTypes.TO);
|
|
addKeyword(TokenNames.U.toUpperCase(),
|
|
TokenTypes.ALLOW_EVENTS); // JvB: added
|
|
addKeyword(TokenNames.V.toUpperCase(), TokenTypes.VIA);
|
|
addKeyword(TokenNames.R.toUpperCase(), TokenTypes.REFER_TO);
|
|
addKeyword(TokenNames.O.toUpperCase(), TokenTypes.EVENT); // Bug
|
|
// fix
|
|
// by
|
|
// Mario
|
|
// Mantak
|
|
addKeyword(TokenNames.X.toUpperCase(), TokenTypes.SESSIONEXPIRES_TO); // Bug fix by Jozef Saniga
|
|
|
|
// JvB: added to support RFC3903
|
|
addKeyword(SIPETagHeader.NAME.toUpperCase(),
|
|
TokenTypes.SIP_ETAG);
|
|
addKeyword(SIPIfMatchHeader.NAME.toUpperCase(),
|
|
TokenTypes.SIP_IF_MATCH);
|
|
|
|
// pmusgrave: Add RFC4028 and ReferredBy
|
|
addKeyword(SessionExpiresHeader.NAME.toUpperCase(),
|
|
TokenTypes.SESSIONEXPIRES_TO);
|
|
addKeyword(MinSEHeader.NAME.toUpperCase(),
|
|
TokenTypes.MINSE_TO);
|
|
addKeyword(ReferredByHeader.NAME.toUpperCase(),
|
|
TokenTypes.REFERREDBY_TO);
|
|
|
|
// pmusgrave RFC3891
|
|
addKeyword(ReplacesHeader.NAME.toUpperCase(),
|
|
TokenTypes.REPLACES_TO);
|
|
//jean deruelle RFC3911
|
|
addKeyword(JoinHeader.NAME.toUpperCase(),
|
|
TokenTypes.JOIN_TO);
|
|
|
|
// IMS Headers
|
|
addKeyword(PathHeader.NAME.toUpperCase(), TokenTypes.PATH);
|
|
addKeyword(ServiceRouteHeader.NAME.toUpperCase(),
|
|
TokenTypes.SERVICE_ROUTE);
|
|
addKeyword(PAssertedIdentityHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_ASSERTED_IDENTITY);
|
|
addKeyword(PPreferredIdentityHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_PREFERRED_IDENTITY);
|
|
addKeyword(PrivacyHeader.NAME.toUpperCase(),
|
|
TokenTypes.PRIVACY);
|
|
|
|
// issued by Miguel Freitas
|
|
addKeyword(PCalledPartyIDHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_CALLED_PARTY_ID);
|
|
addKeyword(PAssociatedURIHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_ASSOCIATED_URI);
|
|
addKeyword(PVisitedNetworkIDHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_VISITED_NETWORK_ID);
|
|
addKeyword(PChargingFunctionAddressesHeader.NAME
|
|
.toUpperCase(),
|
|
TokenTypes.P_CHARGING_FUNCTION_ADDRESSES);
|
|
addKeyword(PChargingVectorHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_VECTOR_CHARGING);
|
|
addKeyword(PAccessNetworkInfoHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_ACCESS_NETWORK_INFO);
|
|
addKeyword(PMediaAuthorizationHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_MEDIA_AUTHORIZATION);
|
|
|
|
addKeyword(SecurityServerHeader.NAME.toUpperCase(),
|
|
TokenTypes.SECURITY_SERVER);
|
|
addKeyword(SecurityVerifyHeader.NAME.toUpperCase(),
|
|
TokenTypes.SECURITY_VERIFY);
|
|
addKeyword(SecurityClientHeader.NAME.toUpperCase(),
|
|
TokenTypes.SECURITY_CLIENT);
|
|
|
|
// added by aayush@rancore
|
|
addKeyword(PUserDatabaseHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_USER_DATABASE);
|
|
|
|
// added by aayush@rancore
|
|
addKeyword(PProfileKeyHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_PROFILE_KEY);
|
|
|
|
// added by aayush@rancore
|
|
addKeyword(PServedUserHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_SERVED_USER);
|
|
|
|
// added by aayush@rancore
|
|
addKeyword(PPreferredServiceHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_PREFERRED_SERVICE);
|
|
|
|
// added by aayush@rancore
|
|
addKeyword(PAssertedServiceHeader.NAME.toUpperCase(),
|
|
TokenTypes.P_ASSERTED_SERVICE);
|
|
|
|
// added References header
|
|
addKeyword(ReferencesHeader.NAME.toUpperCase(),TokenTypes.REFERENCES);
|
|
|
|
// end //
|
|
|
|
|
|
} else if (lexerName.equals("status_lineLexer")) {
|
|
addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
|
|
} else if (lexerName.equals("request_lineLexer")) {
|
|
addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
|
|
} else if (lexerName.equals("sip_urlLexer")) {
|
|
addKeyword(TokenNames.TEL.toUpperCase(), TokenTypes.TEL);
|
|
addKeyword(TokenNames.SIP.toUpperCase(), TokenTypes.SIP);
|
|
addKeyword(TokenNames.SIPS.toUpperCase(), TokenTypes.SIPS);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|