/* 构建SIP消息 */
int sip_message_build(struct sip_message *msg, char *buffer, U32 size)
{
int pos = 0;
char uri_buffer[256];
if (!msg || !buffer || size == 0)
return -EINVAL;
/* 构建起始行 */
if (msg->type == 0)
{
/* 请求行 */
sip_uri_build(&msg->request_uri, uri_buffer, sizeof(uri_buffer));
pos += snprintf(buffer + pos, size - pos, "%s %s",
sip_method_to_string(msg->method), uri_buffer);
if (msg->request_uri.parameters[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, ";%s", msg->request_uri.parameters);
}
pos += snprintf(buffer + pos, size - pos, " SIP/2.0\r\n");
}
else
{
/* 状态行 */
const char *reason = sip_status_to_reason(msg->status_code);
pos += snprintf(buffer + pos, size - pos, "SIP/2.0 %hu %s\r\n",
msg->status_code, reason ? reason : "Unknown");
}
/* 构建Via头 */
if (msg->headers.via.host[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, "Via: %s/%s %s:%hu",
msg->headers.via.protocol, msg->headers.via.transport,
msg->headers.via.host, msg->headers.via.port);
if (msg->headers.via.branch[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, ";branch=%s",
msg->headers.via.branch);
}
pos += snprintf(buffer + pos, size - pos, ";rport");
pos += snprintf(buffer + pos, size - pos, "\r\n");
}
/* 构建Contact头 */
pos += snprintf(buffer + pos, size - pos, msg->headers.contact);
/* 构建To头 */
sip_uri_build(&msg->headers.to, uri_buffer, sizeof(uri_buffer));
pos += snprintf(buffer + pos, size - pos, "To: <%s>", uri_buffer);
/* 添加To tag(如果有) */
if (msg->headers.to.parameters[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, ";tag=%s", msg->headers.to.parameters);
}
pos += snprintf(buffer + pos, size - pos, "\r\n");
/* 构建From头 */
sip_uri_build(&msg->headers.from, uri_buffer, sizeof(uri_buffer));
pos += snprintf(buffer + pos, size - pos, "From: <%s>", uri_buffer);
/* 添加From tag(如果有) */
if (msg->headers.from.parameters[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, ";tag=%s", msg->headers.from.parameters);
}
pos += snprintf(buffer + pos, size - pos, "\r\n");
/* 请求行 */
sip_uri_build(&msg->request_uri, uri_buffer, sizeof(uri_buffer));
/* 构建Authorize头 */
if (strlen(msg->headers.auth.nonce) > 0)
{
pos += snprintf(buffer + pos, size - pos,
"Authorization: Digest username=\"%s\",realm=\"%s\", nonce=\"%s\", uri=\"sip:%s\", response=\"%s\",algorithm=%s\r\n",
msg->headers.from.user, msg->headers.auth.realm, msg->headers.auth.nonce,
msg->headers.auth.realm, msg->headers.auth.response,
"MD5");
}
/* 构建Call-ID头 */
pos += snprintf(buffer + pos, size - pos, "Call-ID: %s\r\n",
msg->headers.call_id);
/* 构建CSeq头 */
pos += snprintf(buffer + pos, size - pos, "CSeq: %u %s\r\n",
msg->headers.cseq, sip_method_to_string(msg->headers.cseq_method));
/* 构建Expires头 */
if (msg->headers.Expires)
{
pos += snprintf(buffer + pos, size - pos, "Expires: %u\r\n",
msg->headers.Expires);
}
/* 构建Max-Forwards头 */
pos += snprintf(buffer + pos, size - pos, "Max-Forwards: %hhu\r\n",
msg->headers.max_forwards);
/* 构建User-Agent头 */
if (msg->headers.user_agent[0] != '\0')
{
pos += snprintf(buffer + pos, size - pos, "User-Agent: %s\r\n",
msg->headers.user_agent);
}
/* 构建Content-Type头(如果有消息体) */
if (msg->body.length > 0)
{
pos += snprintf(buffer + pos, size - pos, "Content-Type: %s\r\n",
msg->body.type);
}
/* 构建Content-Length头 */
pos += snprintf(buffer + pos, size - pos, "Content-Length: %u\r\n",
msg->body.length);
/* 空行分隔头部和消息体 */
pos += snprintf(buffer + pos, size - pos, "\r\n");
/* 添加消息体 */
if (msg->body.length > 0 && msg->body.content)
{
if (pos + msg->body.length < size)
{
memcpy(buffer + pos, msg->body.content, msg->body.length);
pos += msg->body.length;
}
}
return pos;
}给这个函数增加record route的处理逻辑,以及via头部的处理逻辑需要修改,因为可能存在多个via条目
最新发布