代码拉取完成,页面将自动刷新
同步操作将从 北京小程科技有限公司/SIP协议 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package sip
import (
"bufio"
"errors"
"gitee.com/xiaochengtech/sdp"
"io"
"strings"
)
// SIP通用消息(RFC3261-7)
type Message struct {
IsRequest bool // (二选一) 是否是请求
IsResponse bool // (二选一) 是否是应答
RequestLine RequestLine // 请求行
ResponseLine ResponseLine // 应答行
Header Header // 消息包头
Body *sdp.Message // 消息正文(RFC3261-7.4)
}
func NewMessage(rd io.Reader) (msg Message, err error) {
msg = Message{}
err = msg.read(rd)
return
}
func NewResponse(code StatusCodeItem, req *Message) *Message {
return &Message{
IsRequest: false,
IsResponse: true,
ResponseLine: NewResponseLineWithStatusCode(code),
Header: Header{
Via: req.Header.Via,
From: req.Header.From,
To: req.Header.To,
CSeq: req.Header.CSeq,
CallID: req.Header.CallID,
MaxForwards: req.Header.MaxForwards,
},
Body: nil,
}
}
// 字符串表示
func (m *Message) String() (result string) {
// 输出首行
if m.IsRequest {
result += m.RequestLine.String()
} else {
result += m.ResponseLine.String()
}
result += CRLF
// 更新内容长度
bodyString := ""
if m.Body != nil {
bodyString = m.Body.String()
}
m.Header.ContentLength = len(bodyString)
// 写入Header
result += m.Header.String()
// 写入分隔的空行
result += CRLF
// 写入Body
result += bodyString
result += CRLF
return
}
// 获取连接协议
func (m Message) Transport() string {
return m.Header.Via.receivedTransport
}
// 获取连接协议
func (m Message) RealAddress() string {
return m.Header.Via.receivedAddr
}
// 从IO流中读取SIP通用消息
func (m *Message) read(rd io.Reader) (err error) {
buf := bufio.NewReaderSize(rd, 65536)
// 读取起始行
firstLine, err := m.readLine(buf)
if err != nil {
return
}
m.IsResponse = len(firstLine) >= 3 && firstLine[0:3] == "SIP"
m.IsRequest = !m.IsResponse
if m.IsRequest {
m.RequestLine, err = NewRequestLine(firstLine)
} else {
m.ResponseLine, err = NewResponseLine(firstLine)
}
// 读取并解析消息头
for {
// 读取一行
var line string
line, err = m.readLine(buf)
// 空行分隔Header和Body
if len(line) == 0 {
break
}
// 让Header解析行内容
if err = m.Header.parse(line); err != nil {
return
}
}
// 生成消息体
contentLength := m.Header.ContentLength
if contentLength == 0 {
m.Body = nil
return
}
bodyBuffer := make([]byte, contentLength)
n, err := buf.Read(bodyBuffer)
if err != nil {
err = errors.New("sip: message body read faild")
return
}
if n != contentLength {
err = errors.New("sip: message body read length error")
return
}
body, err := sdp.NewMessage(string(bodyBuffer))
if err != nil {
return
}
m.Body = &body
return
}
// 读取一行
func (m Message) readLine(buf *bufio.Reader) (line string, err error) {
// 从缓冲区读取数据
line, err = buf.ReadString('\n')
if err != nil {
err = errors.New("sip: message line read failed")
return
}
if !IsValidLine(line) {
err = errors.New("sip: message line no crlf" + line)
return
}
line = RemoveLineCRLF(line)
line = strings.TrimSpace(line)
return
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。