[sr-dev] git:master: parser: added hook to gr (gruu) parameter in sip_uri_t

Daniel-Constantin Mierla miconda at gmail.com
Fri Apr 13 15:03:20 CEST 2012


Module: sip-router
Branch: master
Commit: 1dd730471dd0620d02b08ce69648c94fc0943818
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1dd730471dd0620d02b08ce69648c94fc0943818

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Apr 13 14:38:48 2012 +0200

parser: added hook to gr (gruu) parameter in sip_uri_t

- gr is specified by GRUU RFC5627

---

 parser/msg_parser.h |    2 +
 parser/parse_uri.c  |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 1 deletions(-)

diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index cf78326..593c4b4 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -212,6 +212,7 @@ struct sip_uri {
 	str method;
 	str lr;
 	str r2; /*!< ser specific rr parameter */
+	str gr;
 	str transport_val; /*!< transport value */
 	str ttl_val;	 /*!< TTL value */
 	str user_param_val; /*!< User= param value */
@@ -219,6 +220,7 @@ struct sip_uri {
 	str method_val; /*!< Method value */
 	str lr_val; /*!< lr value placeholder for lr=on a.s.o*/
 	str r2_val;
+	str gr_val;
 #ifdef USE_COMP
 	unsigned short comp;
 #endif
diff --git a/parser/parse_uri.c b/parser/parse_uri.c
index e6cedcf..a244cf2 100644
--- a/parser/parse_uri.c
+++ b/parser/parse_uri.c
@@ -82,6 +82,8 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 					PLR_L, PLR_R_FIN, PLR_eq,
 					/* r2 */
 					PR2_R, PR2_2_FIN, PR2_eq,
+					/* gr */
+					PGR_G, PGR_R_FIN, PGR_eq,
 #ifdef USE_COMP
 					/* comp */
 					PCOMP_C, PCOMP_O, PCOMP_M, PCOMP_P, PCOMP_eq,
@@ -644,6 +646,11 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 						b=p;
 						state=PR2_R;
 						break;
+					case 'g':
+					case 'G':
+						b=p;
+						state=PGR_G;
+						break;
 #ifdef USE_COMP
 					case 'c':
 					case 'C':
@@ -856,6 +863,42 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 						state=URI_VAL_P;
 				}
 				break;
+			/* gr */
+			param_switch(PGR_G,  'r', 'R', PGR_R_FIN);
+			case PGR_R_FIN:
+				switch(*p){
+					case '@':
+						still_at_user;
+						break;
+					case '=':
+						state=PGR_eq;
+						break;
+					semicolon_case;
+						uri->gr.s=b;
+						uri->gr.len=(p-b);
+						break;
+					question_case;
+						uri->gr.s=b;
+						uri->gr.len=(p-b);
+						break;
+					colon_case;
+						break;
+					default:
+						state=URI_PARAM_P;
+				}
+				break;
+				/* handle gr=something case */
+			case PGR_eq:
+				param=&uri->gr;
+				param_val=&uri->gr_val;
+				switch(*p){
+					param_common_cases;
+					default:
+						v=p;
+						state=URI_VAL_P;
+				}
+				break;
+
 #ifdef USE_COMP
 			param_switch(PCOMP_C,  'o', 'O' , PCOMP_O);
 			param_switch(PCOMP_O,  'm', 'M' , PCOMP_M);
@@ -1007,7 +1050,8 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 		case PM_D:
 		case PM_eq:
 		case PLR_L: /* lr */
-		case PR2_R:  /* r2 */
+		case PR2_R: /* r2 */
+		case PGR_G: /* gr */
 #ifdef USE_COMP
 		case PCOMP_C:
 		case PCOMP_O:
@@ -1033,6 +1077,13 @@ int parse_uri(char* buf, int len, struct sip_uri* uri)
 			uri->r2.s=b;
 			uri->r2.len=p-b;
 			break;
+		case PGR_R_FIN:
+		case PGR_eq:
+			uri->params.s=s;
+			uri->params.len=p-s;
+			uri->gr.s=b;
+			uri->gr.len=p-b;
+			break;
 		case URI_VAL_P:
 		/* intermediate value states */
 		case VU_U:




More information about the sr-dev mailing list