Changeset 2505 for pjproject/trunk/pjsip/src/pjsip/sip_parser.c
- Timestamp:
- Mar 12, 2009 11:25:11 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_parser.c
r2394 r2505 54 54 */ 55 55 #define GENERIC_URI_CHARS "#?;:@&=+-_.!~*'()%$,/" "%" 56 57 #define PJSIP_VERSION "SIP/2.0"58 56 59 57 #define UNREACHED(expr) … … 894 892 } 895 893 894 /* SIP version */ 895 static void parse_sip_version(pj_scanner *scanner) 896 { 897 pj_str_t SIP = { "SIP", 3 }; 898 pj_str_t V2 = { "2.0", 3 }; 899 pj_str_t sip, version; 900 901 pj_scan_get( scanner, &pconst.pjsip_ALPHA_SPEC, &sip); 902 if (pj_scan_get_char(scanner) != '/') 903 on_syntax_error(scanner); 904 pj_scan_get_n( scanner, 3, &version); 905 if (pj_stricmp(&sip, &SIP) || pj_stricmp(&version, &V2)) 906 on_syntax_error(scanner); 907 } 908 909 static pj_bool_t is_next_sip_version(pj_scanner *scanner) 910 { 911 pj_str_t SIP = { "SIP", 3 }; 912 pj_str_t sip; 913 int c; 914 915 c = pj_scan_peek(scanner, &pconst.pjsip_ALPHA_SPEC, &sip); 916 /* return TRUE if it is "SIP" followed by "/" or space. 917 * we include space since the "/" may be separated by space, 918 * although this would mean it would return TRUE if it is a 919 * request and the method is "SIP"! 920 */ 921 return c && (c=='/' || c==' ' || c=='\t') && pj_stricmp(&sip, &SIP)==0; 922 } 923 896 924 /* Internal function to parse SIP message */ 897 925 static pjsip_msg *int_parse_msg( pjsip_parse_ctx *ctx, … … 927 955 928 956 /* Parse request or status line */ 929 if ( pj_scan_stricmp_alnum( scanner, PJSIP_VERSION, 7) == 0) {957 if (is_next_sip_version(scanner)) { 930 958 msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG); 931 959 int_parse_status_line( scanner, &msg->line.status ); … … 1126 1154 1127 1155 1128 /* Parse parameter (";" pname ["=" pvalue]) in header. */1156 /* Parse parameter (";" pname ["=" pvalue]) in SIP header. */ 1129 1157 static void int_parse_param( pj_scanner *scanner, pj_pool_t *pool, 1130 1158 pj_str_t *pname, pj_str_t *pvalue, … … 1514 1542 1515 1543 req_line->uri = int_parse_uri(scanner, pool, PJ_TRUE); 1516 if (pj_scan_stricmp_alnum( scanner, PJSIP_VERSION, 7) != 0) 1517 PJ_THROW( PJSIP_SYN_ERR_EXCEPTION); 1518 pj_scan_advance_n (scanner, 7, 1); 1544 parse_sip_version(scanner); 1519 1545 pj_scan_get_newline( scanner ); 1520 1546 } … … 1526 1552 pj_str_t token; 1527 1553 1528 if (pj_scan_stricmp_alnum(scanner, PJSIP_VERSION, 7) != 0) 1529 PJ_THROW(PJSIP_SYN_ERR_EXCEPTION); 1530 pj_scan_advance_n( scanner, 7, 1); 1531 1554 parse_sip_version(scanner); 1532 1555 pj_scan_get( scanner, &pconst.pjsip_DIGIT_SPEC, &token); 1533 1556 status_line->code = pj_strtoul(&token); … … 1619 1642 /* Parse generic string header. */ 1620 1643 static void parse_generic_string_hdr( pjsip_generic_string_hdr *hdr, 1621 pj_scanner *scanner ) 1622 { 1623 if (pj_cis_match(&pconst.pjsip_NOT_NEWLINE, *scanner->curptr)) 1644 pjsip_parse_ctx *ctx) 1645 { 1646 pj_scanner *scanner = ctx->scanner; 1647 1648 hdr->hvalue.slen = 0; 1649 1650 /* header may be mangled hence the loop */ 1651 while (pj_cis_match(&pconst.pjsip_NOT_NEWLINE, *scanner->curptr)) { 1652 pj_str_t next, tmp; 1653 1624 1654 pj_scan_get( scanner, &pconst.pjsip_NOT_NEWLINE, &hdr->hvalue); 1625 else 1626 hdr->hvalue.slen = 0; 1655 if (IS_NEWLINE(*scanner->curptr)) 1656 break; 1657 /* mangled, get next fraction */ 1658 pj_scan_get( scanner, &pconst.pjsip_NOT_NEWLINE, &next); 1659 /* concatenate */ 1660 tmp.ptr = (char*)pj_pool_alloc(ctx->pool, 1661 hdr->hvalue.slen + next.slen + 2); 1662 tmp.slen = 0; 1663 pj_strcpy(&tmp, &hdr->hvalue); 1664 pj_strcat2(&tmp, " "); 1665 pj_strcat(&tmp, &next); 1666 tmp.ptr[tmp.slen] = '\0'; 1667 1668 hdr->hvalue = tmp; 1669 } 1627 1670 1628 1671 parse_hdr_end(scanner); … … 1935 1978 1936 1979 //Parse with PARAM_CHAR instead, to allow IPv6 1980 //No, back to using int_parse_param() for the "`" character! 1937 1981 //int_parse_param( scanner, pool, &pname, &pvalue, 0); 1938 /* Get ';' character */ 1939 pj_scan_get_char(scanner); 1940 1941 parse_param_imp(scanner, pool, &pname, &pvalue, 1942 &pconst.pjsip_PARAM_CHAR_SPEC, 1943 &pconst.pjsip_PARAM_CHAR_SPEC_ESC, 0); 1982 //parse_param_imp(scanner, pool, &pname, &pvalue, 1983 // &pconst.pjsip_TOKEN_SPEC, 1984 // &pconst.pjsip_TOKEN_SPEC_ESC, 0); 1985 int_parse_param(scanner, pool, &pname, &pvalue, 0); 1944 1986 1945 1987 if (!parser_stricmp(pname, pconst.pjsip_BRANCH_STR) && pvalue.slen) { … … 2076 2118 pj_list_insert_before(first, hdr); 2077 2119 2078 if (pj_scan_stricmp_alnum( scanner, PJSIP_VERSION "/", 8) != 0) 2079 PJ_THROW(PJSIP_SYN_ERR_EXCEPTION); 2080 2081 pj_scan_advance_n( scanner, 8, 1); 2120 parse_sip_version(scanner); 2121 if (pj_scan_get_char(scanner) != '/') 2122 on_syntax_error(scanner); 2082 2123 2083 2124 pj_scan_get( scanner, &pconst.pjsip_TOKEN_SPEC, &hdr->transport); … … 2120 2161 2121 2162 hdr = pjsip_generic_string_hdr_create(ctx->pool, NULL, NULL); 2122 parse_generic_string_hdr(hdr, ctx ->scanner);2163 parse_generic_string_hdr(hdr, ctx); 2123 2164 return (pjsip_hdr*)hdr; 2124 2165
Note: See TracChangeset
for help on using the changeset viewer.