Osip源代码框架05--message消息解析

流程

在这里插入图片描述

解析过程

网络层收到 SIP 消息文本(如 INVITE sip:xxx SIP/2.0 开头的字符串),调用此函数触发解析
预处理与核心分发:__osip_message_parse

  • 调用 osip_util_replace_all_lws 做空白符归一化(把连续空白符、换行符等替换成单个空格,避免格式歧义);
  • 调用 __osip_message_startline_parse 解析起始行(区分请求 / 响应行,提取方法 / 状态码等);
  • 调用 msg_headers_parse 解析消息头域(To/From/CSeq 等核心头,处理多值、折叠行);
  • 调用 msg_osip_body_parse 解析消息体(如 SDP 媒体描述,或其他 MIME 内容)。

osip_util_replace_all_lws:
Contact: sip:alice@example.com
;expires=3600 // 折叠换行,实际是同一行
此函数会把所有空白符(空格、制表符、换行)替换为单个空格,让后续解析逻辑更统一。

起始行解析:__osip_message_startline_parse:
区分请求 / 响应:
请求行格式:METHOD Request-URI SIP/2.0(如 INVITE sip:bob@example.com SIP/2.0);
响应行格式:SIP/2.0 STATUS_CODE Reason(如 SIP/2.0 200 OK)。

提取关键字段:
请求:提取 method(如 INVITE)、req_uri(请求目标);
响应:提取 status_code(如 200)、reason_phrase(如 OK)。

头域解析:msg_headers_parse
复杂点:SIP 头域多且灵活(如 Via 带分支参数、Contact 多地址),需处理:
折叠行合并:还原被拆分的长头域(靠 osip_util_replace_all_lws 预处理后,此处只需拼接);
多值头处理:如 Via 可能有多个分支,需拆分成数组存储;
语法校验:检查 CSeq 格式是否合法(方法 + 序号)、Call-ID 是否符合规范等。

消息体解析:msg_osip_body_parse:
v=0
o=alice 12345 67890 IN IP4 example.com
s=
c=IN IP4 192.168.0.1
t=0 0
m=audio 5000 RTP/AVP 0 8 96

此函数会识别 Content-Type(如 application/sdp),调用对应解析器(SDP 解析逻辑常内置在此步骤),提取媒体类型、端口、编码载荷等

实际开发中的问题映射

  • 解析失败排查:若解析报错,可按调用链反向定位:
    空白符问题 → 看 osip_util_replace_all_lws 处理后的数据;
    起始行格式错 → 检查 __osip_message_startline_parse 返回码;
    头域不合法 → 重点看 msg_headers_parse 对特定头(如 Via)的处理。
  • 扩展场景:若需支持新的 Content-Type(如 application/im-iscomposing+xml 用于聊天状态),需修改 msg_osip_body_parse,添加对应解析分支。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八月的雨季997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值