diff --git a/src/gov/nist/core/LexerCore.java b/src/gov/nist/core/LexerCore.java index 81b61f197..86d99f7d0 100755 --- a/src/gov/nist/core/LexerCore.java +++ b/src/gov/nist/core/LexerCore.java @@ -479,6 +479,56 @@ public String ttokenSafe() { return null; } } + + public String ttokenGenValue() { + int startIdx = ptr; + try { + while (hasMoreChars()) { + char nextChar = lookAhead(0); + if (isAlphaDigit(nextChar)) { + consume(1); + } + else { + boolean isValidChar = false; + switch (nextChar) { + case '_': + case '+': + case '-': + case '!': + case '`': + case '\'': + case '.': + case '/': + case '}': + case '{': + case ']': + case '[': + case '^': + case '|': + case '~': + case '%': // bug fix by Bruno Konik, JvB copied here + case '#': + case '@': + case '$': + case ':': + case '?': + case '\"': + case '*': + isValidChar = true; + } + if (isValidChar) { + consume(1); + } + else { + break; + } + } + } + return String.valueOf(buffer, startIdx, ptr - startIdx); + } catch (ParseException ex) { + return null; + } + } static final char ALPHA_VALID_CHARS = Character.MAX_VALUE; static final char DIGIT_VALID_CHARS = Character.MAX_VALUE - 1; diff --git a/src/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParser.java b/src/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParser.java index 7c1c6d94c..db478ab1b 100644 --- a/src/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParser.java +++ b/src/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParser.java @@ -49,7 +49,7 @@ *
RFC 3455 - Private Header (P-Header) Extensions to the Session Initiation * Protocol (SIP) for the 3rd-Generation Partnership Project (3GPP)
* - *Sintax (RFC 3455):
+ *Syntax (RFC 3455):
** P-Access-Network-Info = "P-Access-Network-Info" HCOLON access-net-spec * access-net-spec = access-type *(SEMI access-info) @@ -60,7 +60,23 @@ * extension-access-info = gen-value * cgi-3gpp = "cgi-3gpp" EQUAL (token / quoted-string) * utran-cell-id-3gpp = "utran-cell-id-3gpp" EQUAL (token / quoted-string) + * gen-value = token / host / quoted-string *+ * + *
RFC 7913 - P-Access-Network-Info ABNF Update
+ *Newer RFC https://tools.ietf.org/html/rfc7913
+ *+ * access-info = cgi-3gpp / utran-cell-id-3gpp / + * dsl-location / i-wlan-node-id / + * ci-3gpp2 / eth-location / + * ci-3gpp2-femto / fiber-location / + * np / gstn-location /local-time-zone / + * dvb-rcs2-node-id / operator-specific-GI / + * utran-sai-3gpp / extension-access-info + * np = "network-provided" + * extension-access-info = generic-param + *+ * * * @author Miguel Freitas (IT) PT-Inovacao */ @@ -104,8 +120,21 @@ public SIPHeader parse() throws ParseException this.lexer.match(';'); this.lexer.SPorHT(); - NameValue nv = super.nameValue('='); - accessNetworkInfo.setParameter(nv); + try { + NameValue nv = super.nameValue('='); + accessNetworkInfo.setParameter(nv); + } catch (ParseException e) { + this.lexer.SPorHT(); + String ext = this.lexer.quotedString(); + if(ext == null) { + ext = this.lexer.ttokenGenValue(); + } else { + // avoids tokens such as "a=b" to be stripped of quotes and misinterpretend as + // RFC 7913 generic-param when re-encoded + ext = "\"" + ext + "\""; + } + accessNetworkInfo.setExtensionAccessInfo(ext); + } this.lexer.SPorHT(); } this.lexer.SPorHT(); diff --git a/src/test/unit/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParserTest.java b/src/test/unit/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParserTest.java index df19323cc..1fdd5dfbf 100644 --- a/src/test/unit/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParserTest.java +++ b/src/test/unit/gov/nist/javax/sip/parser/ims/PAccessNetworkInfoParserTest.java @@ -34,8 +34,15 @@ public void testParser() { String[] accessNetworkInfo = { + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE; [123:4::abcd]; rand=l\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE; a-b.c1; rand=l\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE; 127.0.0.1; rand=l\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE;\"\"\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE;\";\"\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE;\"ip=123.123.123.123\"\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE; [123:4::abcd];rand=l\n", + "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE; [123:4::abcd]\n", "P-Access-Network-Info: IEEE-802.11\n", - "P-Access-Network-Info: 3GPP-UTRAN-TDD; utran-cell-id-3gpp=23456789ABCDE\n" };