Changeset 65 for pjproject/trunk/pjsip/src/pjsip/sip_parser.c
- Timestamp:
- Nov 21, 2005 1:55:47 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_parser.c
- Property svn:eol-style set to native
r64 r65 114 114 pjsip_parser_err_report *err_list); 115 115 static void int_parse_param( pj_scanner *scanner, 116 pj_pool_t *pool, 116 117 pj_str_t *pname, 117 118 pj_str_t *pvalue); 118 119 static void int_parse_hparam( pj_scanner *scanner, 120 pj_pool_t *pool, 119 121 pj_str_t *hname, 120 122 pj_str_t *hvalue ); … … 126 128 pjsip_status_line *line); 127 129 static void int_parse_user_pass( pj_scanner *scanner, 130 pj_pool_t *pool, 128 131 pj_str_t *user, 129 132 pj_str_t *pass); … … 287 290 status = pj_cis_dup(&pjsip_USER_SPEC, &pjsip_ALNUM_SPEC); 288 291 PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 289 pj_cis_add_str( &pjsip_USER_SPEC, ESCAPED USER_UNRESERVED );292 pj_cis_add_str( &pjsip_USER_SPEC, UNRESERVED ESCAPED USER_UNRESERVED ); 290 293 291 294 status = pj_cis_dup(&pjsip_PASSWD_SPEC, &pjsip_ALNUM_SPEC); 292 295 PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 293 pj_cis_add_str( &pjsip_PASSWD_SPEC, MARKESCAPED PASS);296 pj_cis_add_str( &pjsip_PASSWD_SPEC, UNRESERVED ESCAPED PASS); 294 297 295 298 status = pj_cis_init(&cis_buf, &pjsip_PROBE_USER_HOST_SPEC); … … 866 869 867 870 /* Parse parameter (pname ["=" pvalue]). */ 868 void pjsip_parse_param_imp( pj_scanner *scanner, 871 void pjsip_parse_param_imp( pj_scanner *scanner, pj_pool_t *pool, 869 872 pj_str_t *pname, pj_str_t *pvalue, 870 873 unsigned option) … … 872 875 /* pname */ 873 876 pj_scan_get(scanner, &pjsip_PARAM_CHAR_SPEC, pname); 874 pj_str_unescape(pname);877 *pname = pj_str_unescape(pool, pname); 875 878 876 879 /* pvalue, if any */ … … 886 889 } else { 887 890 pj_scan_get(scanner, &pjsip_PARAM_CHAR_SPEC, pvalue); 888 pj_str_unescape(pvalue);891 *pvalue = pj_str_unescape(pool, pvalue); 889 892 } 890 893 } else { … … 895 898 896 899 /* Parse parameter (";" pname ["=" pvalue]). */ 897 static void int_parse_param( pj_scanner *scanner, 900 static void int_parse_param( pj_scanner *scanner, pj_pool_t *pool, 898 901 pj_str_t *pname, pj_str_t *pvalue) 899 902 { … … 902 905 903 906 /* Get pname and optionally pvalue */ 904 pjsip_parse_param_imp(scanner, pname, pvalue, 0); 907 pjsip_parse_param_imp(scanner, pool, pname, pvalue, 908 PJSIP_PARSE_REMOVE_QUOTE); 905 909 } 906 910 907 911 /* Parse header parameter. */ 908 static void int_parse_hparam( pj_scanner *scanner, 912 static void int_parse_hparam( pj_scanner *scanner, pj_pool_t *pool, 909 913 pj_str_t *hname, pj_str_t *hvalue ) 910 914 { … … 914 918 /* hname */ 915 919 pj_scan_get(scanner, &pjsip_HDR_CHAR_SPEC, hname); 916 pj_str_unescape(hname);920 *hname = pj_str_unescape(pool, hname); 917 921 918 922 /* pvalue, if any */ … … 920 924 pj_scan_get_char(scanner); 921 925 pj_scan_get(scanner, &pjsip_HDR_CHAR_SPEC, hvalue); 922 pj_str_unescape(hvalue);926 *hvalue = pj_str_unescape(pool, hvalue); 923 927 } else { 924 928 hvalue->ptr = NULL; … … 937 941 pj_scan_get_char(scanner); 938 942 pj_scan_get(scanner, &pjsip_DIGIT_SPEC, &port); 939 pj_str_unescape(&port);940 943 *p_port = pj_strtoul(&port); 941 944 } else { … … 962 965 963 966 /* Parse user:pass tokens in an URI. */ 964 static void int_parse_user_pass( pj_scanner *scanner, 967 static void int_parse_user_pass( pj_scanner *scanner, pj_pool_t *pool, 965 968 pj_str_t *user, pj_str_t *pass) 966 969 { 967 970 pj_scan_get( scanner, &pjsip_USER_SPEC, user); 968 pj_str_unescape(user);971 *user = pj_str_unescape(pool, user); 969 972 970 973 if ( *scanner->curptr == ':') { 971 974 pj_scan_get_char( scanner ); 972 975 pj_scan_get( scanner, &pjsip_PASSWD_SPEC, pass); 973 pj_str_unescape(pass);976 *pass = pj_str_unescape(pool, pass); 974 977 } else { 975 978 pass->ptr = NULL; … … 1105 1108 1106 1109 if (int_is_next_user(scanner)) { 1107 int_parse_user_pass(scanner, &url->user, &url->passwd);1110 int_parse_user_pass(scanner, pool, &url->user, &url->passwd); 1108 1111 } 1109 1112 … … 1115 1118 pj_str_t pname, pvalue; 1116 1119 1117 int_parse_param( scanner, &pname, &pvalue);1120 int_parse_param( scanner, pool, &pname, &pvalue); 1118 1121 1119 1122 if (!parser_stricmp(pname, pjsip_USER_STR) && pvalue.slen) { … … 1147 1150 pjsip_param *param; 1148 1151 param = pj_pool_alloc(pool, sizeof(pjsip_param)); 1149 int_parse_hparam(scanner, ¶m->name, ¶m->value);1152 int_parse_hparam(scanner, pool, ¶m->name, ¶m->value); 1150 1153 pj_list_insert_before(&url->header_param, param); 1151 1154 hsep = '&'; … … 1168 1171 if (*scanner->curptr == '"') { 1169 1172 pj_scan_get_quote( scanner, '"', '"', &name_addr->display); 1173 /* Trim the leading and ending quote */ 1174 name_addr->display.ptr++; 1175 name_addr->display.slen -= 2; 1170 1176 1171 1177 } else if (*scanner->curptr != '<') { … … 1324 1330 pj_str_t pname, pvalue; 1325 1331 1326 int_parse_param( scanner, &pname, &pvalue);1332 int_parse_param( scanner, pool, &pname, &pvalue); 1327 1333 if (!parser_stricmp(pname, pjsip_Q_STR) && pvalue.slen) { 1328 1334 char *dot_pos = memchr(pvalue.ptr, '.', pvalue.slen); … … 1338 1344 1339 1345 } else { 1340 concat_param(&hdr->other_param, pool, &pname, &pvalue); 1346 pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param)); 1347 p->name = pname; 1348 p->value = pvalue; 1349 pj_list_insert_before(&hdr->other_param, p); 1341 1350 } 1342 1351 } … … 1413 1422 while (*scanner->curptr == ';') { 1414 1423 pj_str_t pname, pvalue; 1415 int_parse_param(scanner, &pname, &pvalue);1424 int_parse_param(scanner, ctx->pool, &pname, &pvalue); 1416 1425 concat_param(&hdr->media.param, ctx->pool, &pname, &pvalue); 1417 1426 } … … 1466 1475 pj_str_t pname, pvalue; 1467 1476 1468 int_parse_param( scanner, &pname, &pvalue);1477 int_parse_param( scanner, pool, &pname, &pvalue); 1469 1478 1470 1479 if (!parser_stricmp(pname, pjsip_TAG_STR)) { … … 1472 1481 1473 1482 } else { 1474 concat_param(&hdr->other_param, pool, &pname, &pvalue); 1483 pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param)); 1484 p->name = pname; 1485 p->value = pvalue; 1486 pj_list_insert_before(&hdr->other_param, p); 1475 1487 } 1476 1488 } … … 1547 1559 pj_str_t pname, pvalue; 1548 1560 1549 int_parse_param( scanner, &pname, &pvalue);1561 int_parse_param( scanner, pool, &pname, &pvalue); 1550 1562 1551 1563 if (!parser_stricmp(pname, pjsip_BRANCH_STR) && pvalue.slen) { … … 1567 1579 hdr->rport_param = 0; 1568 1580 } else { 1569 concat_param( &hdr->other_param, pool, &pname, &pvalue); 1570 } 1571 } 1572 1581 pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param)); 1582 p->name = pname; 1583 p->value = pvalue; 1584 pj_list_insert_before(&hdr->other_param, p); 1585 } 1586 } 1573 1587 } 1574 1588 … … 1603 1617 1604 1618 pj_memcpy(&hdr->name_addr, temp, sizeof(*temp)); 1605 if (*scanner->curptr == ';') { 1606 pj_scan_get_until(scanner, &pjsip_NEWLINE_OR_EOF_SPEC, 1607 &hdr->other_param); 1619 1620 while (*scanner->curptr == ';') { 1621 pjsip_param *p = pj_pool_alloc(pool, sizeof(pjsip_param)); 1622 int_parse_param(scanner, pool, &p->name, &p->value); 1623 pj_list_insert_before(&hdr->other_param, p); 1608 1624 } 1609 1625 }
Note: See TracChangeset
for help on using the changeset viewer.