📄 sip_parse.c
字号:
value->int_val = 0; value->sip_value_state = SIP_VALUE_BAD; goto next_val; } value->int_val = i; goto end; } next_val: if (sip_find_token(hdr, SIP_COMMA) != 0) break; value->sip_value_end = hdr->sip_hdr_current - 1; last_value = value; (void) sip_skip_white_space(hdr); }end: *phdr = parsed_header; return (0);}/* * Call-Info = "Call-Info" HCOLON info * (COMMA info) * info = LAQUOT absoluteURI RAQUOT * (SEMI info-param) * info-param = ("purpose" EQUAL ("icon" | "info" | "card" | token)) | * generic-param */intsip_parse_callinfo_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser3(sip_header, header, SIP_STR_VAL, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * Content-Disposition = "Content-Disposition" HCOLON disp-type * * (SEMI disp-param) * disp-type = "render" | "session" | "icon" | "alert" | disp-ext-token * disp-param = handling-param | generic-param * handling-param = "handling" EQUAL("optional" | "required" | other-handling) * other-handling = token * disp-ext-token = token * */intsip_parse_contentdis_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * Content-Encoding = ("Content-Encoding" | "e") HCOLON content-coding * * (COMMA content-coding) */intsip_parse_contentencode_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * Content-Language = ("Content-Language" | "l") HCOLON lang-tag * * (COMMA lang-tag) * lang-tag = primary-tag *("-" subtag) * prmary-tag = 1*8ALPHA * subtag = 1*8ALPHA */intsip_parse_contentlang_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * Error-Info = "Error-Info" HCOLON error-uri *(COMMA error-uri) * error-uri = LAQUOT absoluteURI RAQUOT *(SEMI generic-param) */intsip_parse_errorinfo_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser3(sip_header, header, SIP_STR_VAL, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * Expires = "Expires" HCOLON delta-seconds */intsip_parse_expire_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser2(sip_header, header, SIP_INT_VAL); sip_header->sip_hdr_parsed = *header; return (r);}/* * In-Reply-To = "In-Reply-To" HCOLON callid *(COMMA callid) */intsip_parse_inreplyto_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * RSeq = "RSeq" HCOLON response-num */intsip_parse_rseq(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; sip_hdr_value_t *rseq_value; r = sip_parse_hdr_parser2(sip_header, header, SIP_INT_VAL); sip_header->sip_hdr_parsed = *header; /* Additionally, a value of 0 is bad_value */ if (sip_header->sip_hdr_parsed != NULL && sip_header->sip_hdr_parsed->value != NULL) { rseq_value = (sip_hdr_value_t *) sip_header->sip_hdr_parsed->value; if (rseq_value->int_val == 0) rseq_value->sip_value_state = SIP_VALUE_BAD; } return (r);}/* min-expires, same as expires */intsip_parse_minexpire_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser2(sip_header, header, SIP_INT_VAL); sip_header->sip_hdr_parsed = *header; return (r);}/* * MIME-Version = "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT */intsip_parse_mimeversion_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser4(sip_header, header); sip_header->sip_hdr_parsed = *header; return (r);}/* * Organization = "Organization" HCOLON [TEXT-UTF8-TRIM] */intsip_parse_org_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; if (!sip_is_empty_hdr(sip_header)) { r = sip_parse_hdr_empty(sip_header, header); return (r); } r = sip_parse_hdr_parser4(sip_header, header); sip_header->sip_hdr_parsed = *header; return (r);}/* * Priority = "Priority" HCOLON priority-val * priority-val = "emergency" | "urgent" | "normal" | "non-urgent" | other * other = token */intsip_parse_priority_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_ainfo_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_preq_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_author_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser5(sip_header, header, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_pauthor_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser5(sip_header, header, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_pauthen_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser5(sip_header, header, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}intsip_parse_wauthen_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser5(sip_header, header, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * Reply-To = "Reply-To" HCOLON rplyto-spec * rplyto-spec = (name-addr | addr-spec) *(SEMI rplyto-param) * rplyto-param = generic-param * name-addr = [ display-name ] LAQUOT addr-spec RAQUOT * addr-spec = SIP-URI | SIPS-URI | absolute URI */intsip_parse_replyto_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser3(sip_header, header, SIP_STRS_VAL, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * PAssertedID = "P-Asserted-Identity" HCOLON PAssertedID-value * *(COMMA PAssertedID-value) * PAssertedID-value = name-addr / addr-spec */intsip_parse_passertedid(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser3(sip_header, header, SIP_STRS_VAL, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * PPreferredID = "P-Preferred-Identity" HCOLON PPreferredID-value * *(COMMA PAssertedID-value) * PPreferredID-value = name-addr / addr-spec */intsip_parse_ppreferredid(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser3(sip_header, header, SIP_STRS_VAL, B_TRUE); sip_header->sip_hdr_parsed = *header; return (r);}/* * PRIVACY = "Privacy" HCOLON priv-value *(COMMA priv-value) * priv-value = "header" / "session" / "user" / "none" / "critical" * / token / id */intsip_parse_privacy_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * Require = "Require" HCOLON option-tag * (COMMA option-tag) */intsip_parse_require_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/* * Retry-After = "Retry-After" HCOLON delta-seconds [ comment ] * * (SEMI retry-param) * retry-param = "duration" EQUAL delta-seconds */intsip_parse_retryaft_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ sip_parsed_header_t *parsed_header; sip_hdr_value_t *value = NULL; int ret; if (sip_header == NULL || header == NULL) return (EINVAL); /* check if already parsed */ if (sip_header->sip_hdr_parsed != NULL) { *header = sip_header->sip_hdr_parsed; return (0); } *header = NULL; assert(sip_header->sip_hdr_start == sip_header->sip_hdr_current); if (sip_parse_goto_values(sip_header)) return (EPROTO); parsed_header = calloc(1, sizeof (sip_parsed_header_t)); if (parsed_header == NULL) return (ENOMEM); parsed_header->sip_header = sip_header; value = calloc(1, sizeof (sip_hdr_value_t)); if (value == NULL) { sip_free_phdr(parsed_header); return (ENOMEM); } parsed_header->value = (sip_value_t *)value; value->sip_value_start = sip_header->sip_hdr_current; value->sip_value_header = parsed_header; ret = sip_atoi(sip_header, &(value->intstr_int)); if (ret != 0) value->sip_value_state = SIP_VALUE_BAD; if (sip_find_token(sip_header, SIP_LPAR) == 0) { value->intstr_str_ptr = sip_header->sip_hdr_current; if (sip_find_token(sip_header, SIP_RPAR) == 0) { value->intstr_str_len = sip_header->sip_hdr_current - value->intstr_str_ptr - 1; if (sip_find_token(sip_header, SIP_SEMI) == 0) { sip_header->sip_hdr_current--; (void) sip_parse_params(sip_header, &(value->sip_param_list)); } } else { value->sip_value_state = SIP_VALUE_BAD; return (EPROTO); } } else { value->intstr_str_ptr = NULL; value->intstr_str_len = 0; /* from value start, search if parameter list */ sip_header->sip_hdr_current = value->sip_value_start; if (sip_find_token(sip_header, SIP_SEMI) == 0) { sip_header->sip_hdr_current--; (void) sip_parse_params(sip_header, &(value->sip_param_list)); } } *header = parsed_header; sip_header->sip_hdr_parsed = *header; return (0);}/* * Server = "Server" HCOLON servel-val *(LWS server-val) * servel-val = product|comment * product = token [SLASH version] * version = token * Treated as one single string */intsip_parse_server_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; r = sip_parse_hdr_parser4(sip_header, header); sip_header->sip_hdr_parsed = *header; return (r);}/* * Subject = ("Subject" | "s")HCOLON [TEXT-UTF8-TRIM] */intsip_parse_subject_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; if (!sip_is_empty_hdr(sip_header)) { r = sip_parse_hdr_empty(sip_header, header); return (r); } r = sip_parse_hdr_parser4(sip_header, header); sip_header->sip_hdr_parsed = *header; return (r);}/* * XXXXX supported, same as require * Supported = ("Supported" | "k") HCOLON [option-tag * (COMMA option-tag) ] */intsip_parse_support_header(_sip_header_t *sip_header, sip_parsed_header_t **header){ int r; if (!sip_is_empty_hdr(sip_header)) { r = sip_parse_hdr_empty(sip_header, header); return (r); } r = sip_parse_hdr_parser1(sip_header, header, (char)NULL); sip_header->sip_hdr_parsed = *header; return (r);}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -