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" };