Ignore:
Timestamp:
Jul 17, 2006 10:04:12 AM (18 years ago)
Author:
bennylp
Message:

Fixed bugs with the parsing (re: allowable chars): (1) Parameters in URI and header should have different spec. URI should use paramchar spec while header should use token spec (thanks Jeroen van Bemmel) (2) The same rule applies when escaping the parameters during printing process (3) While we're on it, also fixed the tel-URI parser to automatically unescape the parameter values.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_parser.c

    r587 r606  
    4141#define USER_UNRESERVED     "&=+$,;?/" 
    4242#define PASS                "&=+$," 
    43 #define TOKEN               "-.!%*_=`'~+"   /* '+' is because of app/pidf+xml 
    44                                              * in Content-Type! */ 
     43#define TOKEN               "-.!%*_`'~+"   /* '=' was removed for parsing  
     44                                            * param */ 
    4545#define HOST                "_-." 
    4646#define HEX_DIGIT           "abcdefABCDEF" 
     
    139139                                     pj_str_t *pname,  
    140140                                     pj_str_t *pvalue); 
     141static void         int_parse_uri_param( pj_scanner *scanner,  
     142                                         pj_pool_t *pool, 
     143                                         pj_str_t *pname,  
     144                                         pj_str_t *pvalue); 
    141145static void         int_parse_hparam( pj_scanner *scanner, 
    142146                                      pj_pool_t *pool, 
     
    325329    pj_cis_add_str( &pjsip_TOKEN_SPEC, TOKEN); 
    326330 
     331    /* TOKEN must not have '%' */ 
     332    pj_assert(pj_cis_match(&pjsip_TOKEN_SPEC, '%')==0); 
     333 
    327334    status = pj_cis_dup(&pjsip_HOST_SPEC, &pjsip_ALNUM_SPEC); 
    328335    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 
     
    10391046} 
    10401047 
     1048 
    10411049/* Parse parameter (pname ["=" pvalue]). */ 
    1042 void pjsip_parse_param_imp( pj_scanner *scanner, pj_pool_t *pool, 
     1050static void parse_param_imp( pj_scanner *scanner, pj_pool_t *pool, 
    10431051                             pj_str_t *pname, pj_str_t *pvalue, 
     1052                             const pj_cis_t *spec, const pj_cis_t *esc_spec, 
    10441053                             unsigned option) 
    10451054{ 
    10461055    /* pname */ 
    1047     parser_get_and_unescape(scanner, pool, &pjsip_PARAM_CHAR_SPEC, 
    1048                             &pjsip_PARAM_CHAR_SPEC_ESC, pname); 
     1056    parser_get_and_unescape(scanner, pool, spec, esc_spec, pname); 
    10491057 
    10501058    /* init pvalue */ 
     
    10631071                    pvalue->slen -= 2; 
    10641072                } 
    1065             } else if(pj_cis_match(&pjsip_PARAM_CHAR_SPEC, *scanner->curptr)) { 
    1066                 parser_get_and_unescape(scanner, pool, &pjsip_PARAM_CHAR_SPEC,  
    1067                                         &pjsip_PARAM_CHAR_SPEC_ESC, pvalue); 
     1073            } else if(pj_cis_match(spec, *scanner->curptr)) { 
     1074                parser_get_and_unescape(scanner, pool, spec, esc_spec, pvalue); 
    10681075            } 
    10691076        } 
     
    10711078} 
    10721079 
    1073 /* Parse parameter (";" pname ["=" pvalue]). */ 
     1080/* Parse parameter (pname ["=" pvalue]) using token. */ 
     1081void pjsip_parse_param_imp(  pj_scanner *scanner, pj_pool_t *pool, 
     1082                             pj_str_t *pname, pj_str_t *pvalue, 
     1083                             unsigned option) 
     1084{ 
     1085    parse_param_imp(scanner, pool, pname, pvalue, &pjsip_TOKEN_SPEC, 
     1086                    &pjsip_TOKEN_SPEC, option); 
     1087} 
     1088 
     1089 
     1090/* Parse parameter (pname ["=" pvalue]) using paramchar. */ 
     1091void pjsip_parse_uri_param_imp(pj_scanner *scanner, pj_pool_t *pool, 
     1092                               pj_str_t *pname, pj_str_t *pvalue, 
     1093                               unsigned option) 
     1094{ 
     1095    parse_param_imp(scanner, pool, pname, pvalue, &pjsip_PARAM_CHAR_SPEC, 
     1096                    &pjsip_PARAM_CHAR_SPEC_ESC, option); 
     1097} 
     1098 
     1099 
     1100/* Parse parameter (";" pname ["=" pvalue]) in header. */ 
    10741101static void int_parse_param( pj_scanner *scanner, pj_pool_t *pool, 
    10751102                             pj_str_t *pname, pj_str_t *pvalue) 
     
    10821109                          PJSIP_PARSE_REMOVE_QUOTE); 
    10831110} 
     1111 
     1112/* Parse parameter (";" pname ["=" pvalue]) in URI. */ 
     1113static void int_parse_uri_param( pj_scanner *scanner, pj_pool_t *pool, 
     1114                                 pj_str_t *pname, pj_str_t *pvalue) 
     1115{ 
     1116    /* Get ';' character */ 
     1117    pj_scan_get_char(scanner); 
     1118 
     1119    /* Get pname and optionally pvalue */ 
     1120    pjsip_parse_uri_param_imp(scanner, pool, pname, pvalue,  
     1121                              PJSIP_PARSE_REMOVE_QUOTE); 
     1122} 
     1123 
    10841124 
    10851125/* Parse header parameter. */ 
     
    12981338        pj_str_t pname, pvalue; 
    12991339 
    1300         int_parse_param( scanner, pool, &pname, &pvalue); 
     1340        int_parse_uri_param( scanner, pool, &pname, &pvalue); 
    13011341 
    13021342        if (!parser_stricmp(pname, pjsip_USER_STR) && pvalue.slen) { 
Note: See TracChangeset for help on using the changeset viewer.