Documentation ¶
Overview ¶
Originally forked from https://github.com/ghettovoice/gosip by @ghetovoice
Index ¶
- Constants
- Variables
- func ASCIIToLower(s string) string
- func ASCIIToLowerInPlace(s []byte)
- func ASCIIToUpper(s string) string
- func CopyHeaders(name string, from, to Message)
- func DefaultHeadersParser() map[string]HeaderParser
- func DefaultPort(transport string) int
- func GenerateBranch() string
- func GenerateBranchN(n int) string
- func GenerateTagN(n int) string
- func HeaderToLower(s string) string
- func IsReliable(network string) bool
- func MakeClientTxKey(msg Message) (string, error)
- func MakeDialogID(callID, innerID, externalID string) string
- func MakeDialogIDFromRequest(msg *Request) (string, error)
- func MakeDialogIDFromResponse(msg *Response) (string, error)
- func MakeServerTxKey(msg Message) (string, error)
- func MessageShortString(msg Message) string
- func NetworkToLower(network string) string
- func NonceWrite(buf []byte)
- func ParseAddr(addr string) (host string, port int, err error)
- func ParseAddressValue(addressText string, uri *Uri, headerParams HeaderParams) (displayName string, err error)
- func ParseUri(uriStr string, uri *Uri) (err error)
- func RandString(n int) string
- func RandStringBytesMask(sb *strings.Builder, n int) string
- func ResolveInterfacesIP(network string, targetIP net.IP) (net.IP, net.Interface, error)
- func SIPDebugTracer(t SIPTracer)
- func SetTimers(t1, t2, t4 time.Duration)
- func SplitByWhitespace(text string) []string
- func UACReadRequestDialogID(msg *Request) (string, error)
- func UASReadRequestDialogID(msg *Request) (string, error)
- func UnmarshalParams(s string, seperator rune, ending rune, p HeaderParams) (n int, err error)
- func UriIsSIP(s string) bool
- func UriIsSIPS(s string) bool
- type Addr
- type CSeqHeader
- type CallIDHeader
- type ClientTransaction
- type ClientTx
- func (tx *ClientTx) Done() <-chan struct{}
- func (tx *ClientTx) Err() error
- func (tx *ClientTx) Init() error
- func (tx *ClientTx) Key() string
- func (tx *ClientTx) OnTerminate(f FnTxTerminate)
- func (tx *ClientTx) Origin() *Request
- func (tx *ClientTx) Receive(res *Response)
- func (tx *ClientTx) Responses() <-chan *Response
- func (tx *ClientTx) String() string
- func (tx *ClientTx) Terminate()
- type Connection
- type ConnectionPool
- func (p *ConnectionPool) Add(a string, c Connection)
- func (p *ConnectionPool) AddIfNotExists(a string, c Connection)
- func (p *ConnectionPool) Clear()
- func (p *ConnectionPool) CloseAndDelete(c Connection, addr string)
- func (p *ConnectionPool) Delete(addr string)
- func (p *ConnectionPool) DeleteMultiple(addrs []string)
- func (p *ConnectionPool) Get(a string) (c Connection)
- func (p *ConnectionPool) Size() int
- type ContactHeader
- type ContentLengthHeader
- type ContentTypeHeader
- type CopyHeader
- type DialogState
- type ErrorHandler
- type ExpiresHeader
- type FnTxTerminate
- type FromHeader
- type Header
- type HeaderKV
- type HeaderParams
- func (hp HeaderParams) Add(key string, val string) HeaderParams
- func (hp HeaderParams) Clone() HeaderParams
- func (hp HeaderParams) Equals(other interface{}) bool
- func (hp HeaderParams) Get(key string) (string, bool)
- func (hp HeaderParams) Has(key string) bool
- func (hp HeaderParams) Items() map[string]string
- func (hp HeaderParams) Keys() []string
- func (hp HeaderParams) Length() int
- func (hp HeaderParams) Remove(key string) HeaderParams
- func (hp HeaderParams) String() string
- func (hp HeaderParams) ToString(sep uint8) string
- func (hp HeaderParams) ToStringWrite(sep uint8, buffer io.StringWriter)
- type HeaderParser
- type MaxForwardsHeader
- type Message
- type MessageData
- func (hs *MessageData) AppendHeader(header Header)
- func (hs *MessageData) AppendHeaderAfter(header Header, name string)
- func (msg *MessageData) Body() []byte
- func (hs *MessageData) CSeq() *CSeqHeader
- func (hs *MessageData) CallID() *CallIDHeader
- func (hs *MessageData) CloneHeaders() []Header
- func (hs *MessageData) Contact() *ContactHeader
- func (hs *MessageData) ContentLength() *ContentLengthHeader
- func (hs *MessageData) ContentType() *ContentTypeHeader
- func (msg *MessageData) Destination() string
- func (hs *MessageData) From() *FromHeader
- func (hs *MessageData) GetHeader(name string) Header
- func (hs *MessageData) GetHeaders(name string) []Header
- func (hs *MessageData) Headers() []Header
- func (hs *MessageData) MaxForwards() *MaxForwardsHeader
- func (hs *MessageData) PrependHeader(headers ...Header)
- func (hs *MessageData) RecordRoute() *RecordRouteHeader
- func (hs *MessageData) RemoveHeader(name string) (removed bool)
- func (hs *MessageData) ReplaceHeader(header Header)
- func (hs *MessageData) Route() *RouteHeader
- func (msg *MessageData) SetBody(body []byte)
- func (msg *MessageData) SetDestination(dest string)
- func (msg *MessageData) SetSource(src string)
- func (msg *MessageData) SetTransport(tp string)
- func (msg *MessageData) Source() string
- func (hs *MessageData) String() string
- func (hs *MessageData) StringWrite(buffer io.StringWriter)
- func (hs *MessageData) To() *ToHeader
- func (msg *MessageData) Transport() string
- func (hs *MessageData) Via() *ViaHeader
- type MessageHandler
- type Parser
- type ParserOption
- type ParserStream
- type RecordRouteHeader
- func (h *RecordRouteHeader) Clone() *RecordRouteHeader
- func (h *RecordRouteHeader) Name() string
- func (h *RecordRouteHeader) String() string
- func (h *RecordRouteHeader) StringWrite(buffer io.StringWriter)
- func (h *RecordRouteHeader) Value() string
- func (h *RecordRouteHeader) ValueStringWrite(buffer io.StringWriter)
- type Request
- func (hs *Request) AppendHeader(header Header)
- func (hs *Request) AppendHeaderAfter(header Header, name string)
- func (hs *Request) CSeq() *CSeqHeader
- func (hs *Request) CallID() *CallIDHeader
- func (req *Request) Clone() *Request
- func (hs *Request) CloneHeaders() []Header
- func (hs *Request) Contact() *ContactHeader
- func (hs *Request) ContentLength() *ContentLengthHeader
- func (hs *Request) ContentType() *ContentTypeHeader
- func (req *Request) Destination() string
- func (hs *Request) From() *FromHeader
- func (hs *Request) GetHeader(name string) Header
- func (hs *Request) GetHeaders(name string) []Header
- func (hs *Request) Headers() []Header
- func (req *Request) IsAck() bool
- func (req *Request) IsCancel() bool
- func (req *Request) IsInvite() bool
- func (hs *Request) MaxForwards() *MaxForwardsHeader
- func (hs *Request) PrependHeader(headers ...Header)
- func (hs *Request) RecordRoute() *RecordRouteHeader
- func (hs *Request) RemoveHeader(name string) (removed bool)
- func (hs *Request) ReplaceHeader(header Header)
- func (hs *Request) Route() *RouteHeader
- func (req *Request) Short() string
- func (req *Request) Source() string
- func (req *Request) StartLine() string
- func (req *Request) StartLineWrite(buffer io.StringWriter)
- func (req *Request) String() string
- func (req *Request) StringWrite(buffer io.StringWriter)
- func (hs *Request) To() *ToHeader
- func (req *Request) Transport() string
- func (hs *Request) Via() *ViaHeader
- type RequestHandler
- type RequestMethod
- type Response
- func (hs *Response) AppendHeader(header Header)
- func (hs *Response) AppendHeaderAfter(header Header, name string)
- func (hs *Response) CSeq() *CSeqHeader
- func (hs *Response) CallID() *CallIDHeader
- func (res *Response) Clone() *Response
- func (hs *Response) CloneHeaders() []Header
- func (hs *Response) Contact() *ContactHeader
- func (hs *Response) ContentLength() *ContentLengthHeader
- func (hs *Response) ContentType() *ContentTypeHeader
- func (res *Response) Destination() string
- func (hs *Response) From() *FromHeader
- func (hs *Response) GetHeader(name string) Header
- func (hs *Response) GetHeaders(name string) []Header
- func (hs *Response) Headers() []Header
- func (res *Response) IsAck() bool
- func (res *Response) IsCancel() bool
- func (res *Response) IsClientError() bool
- func (res *Response) IsGlobalError() bool
- func (res *Response) IsProvisional() bool
- func (res *Response) IsRedirection() bool
- func (res *Response) IsServerError() bool
- func (res *Response) IsSuccess() bool
- func (hs *Response) MaxForwards() *MaxForwardsHeader
- func (hs *Response) PrependHeader(headers ...Header)
- func (hs *Response) RecordRoute() *RecordRouteHeader
- func (hs *Response) RemoveHeader(name string) (removed bool)
- func (hs *Response) ReplaceHeader(header Header)
- func (hs *Response) Route() *RouteHeader
- func (res *Response) Short() string
- func (res *Response) StartLine() string
- func (res *Response) StartLineWrite(buffer io.StringWriter)
- func (res *Response) String() string
- func (res *Response) StringWrite(buffer io.StringWriter)
- func (hs *Response) To() *ToHeader
- func (res *Response) Transport() string
- func (hs *Response) Via() *ViaHeader
- type RouteHeader
- type SIPTracer
- type ServerTransaction
- type ServerTx
- func (tx *ServerTx) Acks() <-chan *Request
- func (tx *ServerTx) Done() <-chan struct{}
- func (tx *ServerTx) Err() error
- func (tx *ServerTx) Init() error
- func (tx *ServerTx) Key() string
- func (tx *ServerTx) OnCancel(f func(r *Request))
- func (tx *ServerTx) OnTerminate(f FnTxTerminate)
- func (tx *ServerTx) Origin() *Request
- func (tx *ServerTx) Receive(req *Request) error
- func (tx *ServerTx) Respond(res *Response) error
- func (tx *ServerTx) String() string
- func (tx *ServerTx) Terminate()
- type StatusCode
- type TCPConnection
- type ToHeader
- type Transaction
- type TransactionLayer
- func (txl *TransactionLayer) Close()
- func (txl *TransactionLayer) OnRequest(h RequestHandler)
- func (txl *TransactionLayer) Request(ctx context.Context, req *Request) (*ClientTx, error)
- func (txl *TransactionLayer) Respond(res *Response) (*ServerTx, error)
- func (txl *TransactionLayer) Transport() *TransportLayer
- func (txl *TransactionLayer) UnhandledResponseHandler(f UnhandledResponseHandler)
- type Transport
- type TransportLayer
- func (l *TransportLayer) ClientRequestConnection(ctx context.Context, req *Request) (c Connection, err error)
- func (l *TransportLayer) Close() error
- func (l *TransportLayer) GetConnection(network, addr string) (Connection, error)
- func (l *TransportLayer) GetListenPort(network string) int
- func (l *TransportLayer) OnMessage(h MessageHandler)
- func (l *TransportLayer) ServeTCP(c net.Listener) error
- func (l *TransportLayer) ServeTLS(c net.Listener) error
- func (l *TransportLayer) ServeUDP(c net.PacketConn) error
- func (l *TransportLayer) ServeWS(c net.Listener) error
- func (l *TransportLayer) ServeWSS(c net.Listener) error
- func (l *TransportLayer) WriteMsg(msg Message) error
- func (l *TransportLayer) WriteMsgTo(msg Message, addr string, network string) error
- type UDPConnection
- func (c *UDPConnection) Close() error
- func (c *UDPConnection) LocalAddr() net.Addr
- func (c *UDPConnection) Read(b []byte) (n int, err error)
- func (c *UDPConnection) ReadFrom(b []byte) (n int, addr net.Addr, err error)
- func (c *UDPConnection) Ref(i int) int
- func (c *UDPConnection) RemoteAddr() net.Addr
- func (c *UDPConnection) TryClose() (int, error)
- func (c *UDPConnection) Write(b []byte) (n int, err error)
- func (c *UDPConnection) WriteMsg(msg Message) error
- func (c *UDPConnection) WriteTo(b []byte, addr net.Addr) (n int, err error)
- type UnhandledResponseHandler
- type Uri
- type ViaHeader
- type WSConnection
Constants ¶
const ( MTU uint = 1500 DefaultHost = "127.0.0.1" DefaultProtocol = "UDP" DefaultUdpPort int = 5060 DefaultTcpPort int = 5060 DefaultTlsPort int = 5061 DefaultWsPort int = 80 DefaultWssPort int = 443 // Transport for different sip messages. GO uses lowercase, but for message parsing, we should // use this constants for setting message Transport TransportUDP = "UDP" TransportTCP = "TCP" TransportTLS = "TLS" TransportWS = "WS" TransportWSS = "WSS" // TransportFixedLengthMessage sets message size limit for parsing and avoids stream parsing TransportFixedLengthMessage uint16 = 0 )
const (
FsmInputNone fsmInput = iota
)
FSM Inputs
const (
RFC3261BranchMagicCookie = "z9hG4bK"
)
Variables ¶
var ( ErrParseLineNoCRLF = errors.New("line has no CRLF") ErrParseEOF = errors.New("EOF on reading line") // Stream parse errors ErrParseSipPartial = errors.New("SIP partial data") ErrParseReadBodyIncomplete = errors.New("reading body incomplete") ErrParseMoreMessages = errors.New("Stream has more message") )
var ( // SIP timers are exposed for manipulation but best approach is using SetTimers // where all timers get populated based on // T1: Round-trip time (RTT) estimate, Default 500ms T1, T2, T4, Timer_A, Timer_B, Timer_D, Timer_E, Timer_F, Timer_G, Timer_H, Timer_I, Timer_J, Timer_K, Timer_L, Timer_M time.Duration Timer_1xx = 200 * time.Millisecond TxSeperator = "__" TransactionFSMDebug bool )
var ( // Transaction Layer Errors can be detected and handled with different response on caller side // https://www.rfc-editor.org/rfc/rfc3261#section-8.1.3.1 ErrTransactionTimeout = errors.New("transaction timeout") ErrTransactionTransport = errors.New("transaction transport error") ErrTransactionCanceled = errors.New("transaction canceled") )
var ( UDPMTUSize = 1500 ErrUDPMTUCongestion = errors.New("size of packet larger than MTU") )
var ( // Errors ErrTransportNotSuported = errors.New("protocol not supported") )
var ( // IdleConnection will keep connections idle even after transaction terminate // -1 - single response or request will close // 0 - close connection immediatelly after transaction terminate // 1 - keep connection idle after transaction termination IdleConnection int = 1 )
var (
SIPDebug bool
)
var ( // WebSocketProtocols is used in setting websocket header // By default clients must accept protocol sip WebSocketProtocols = []string{"sip"} )
Functions ¶
func ASCIIToLower ¶
ASCIIToLower is faster than go version. It avoids one more loop
func ASCIIToLowerInPlace ¶
func ASCIIToLowerInPlace(s []byte)
func ASCIIToUpper ¶ added in v0.25.0
func CopyHeaders ¶
Copy all headers of one type from one message to another. Appending to any headers that were already there.
func DefaultHeadersParser ¶ added in v0.15.0
func DefaultHeadersParser() map[string]HeaderParser
DefaultHeadersParser returns minimal version header parser. It can be extended or overwritten. Removing some defaults can break SIP functionality
NOTE this API call may change
func DefaultPort ¶
DefaultPort returns transport default port by network.
func GenerateBranchN ¶ added in v0.7.2
GenerateBranchN returns random unique branch ID in format MagicCookie.<n chars>
func GenerateTagN ¶ added in v0.11.0
func IsReliable ¶ added in v0.16.0
func MakeClientTxKey ¶ added in v0.16.0
MakeClientTxKey creates client key for matching responses - RFC 3261 17.1.3.
func MakeDialogID ¶
func MakeDialogIDFromRequest ¶ added in v0.13.0
MakeDialogIDFromMessage creates dialog ID of message. Use UASReadRequestDialogID UACReadRequestDialogID for more specific returns error if callid or to tag or from tag does not exists
func MakeDialogIDFromResponse ¶ added in v0.13.0
MakeDialogIDFromResponse creates dialog ID of message. returns error if callid or to tag or from tag does not exists
func MakeServerTxKey ¶ added in v0.16.0
MakeServerTxKey creates server key for matching retransmitting requests - RFC 3261 17.2.3.
func MessageShortString ¶ added in v0.8.0
MessageShortString dumps short version of msg. Used only for logging
func NetworkToLower ¶ added in v0.16.0
NetworkToLower is faster function converting UDP, TCP to udp, tcp
func NonceWrite ¶ added in v0.7.2
func NonceWrite(buf []byte)
func ParseAddressValue ¶ added in v0.15.0
func ParseAddressValue(addressText string, uri *Uri, headerParams HeaderParams) (displayName string, err error)
ParseAddressValue parses an address - such as from a From, To, or Contact header. It returns: See RFC 3261 section 20.10 for details on parsing an address.
func ParseUri ¶ added in v0.15.0
ParseUri converts a string representation of a URI into a Uri object. Following https://datatracker.ietf.org/doc/html/rfc3261#section-19.1.1 sip:user:password@host:port;uri-parameters?headers
func RandStringBytesMask ¶ added in v0.7.2
https://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-go
func ResolveInterfacesIP ¶ added in v0.21.0
ResolveInterfaceIP will check current interfaces and resolve to IP Using targetIP it will try to match interface with same subnet network can be "ip" "ip4" "ip6" by default it avoids loopack IP unless targetIP is loopback
func SIPDebugTracer ¶ added in v0.25.0
func SIPDebugTracer(t SIPTracer)
func SplitByWhitespace ¶
Splits the given string into sections, separated by one or more characters from c_ABNF_WS.
func UACReadRequestDialogID ¶ added in v0.21.0
UACReadRequestDialogID creates dialog ID of message if receiver has UAC role. returns error if callid or to tag or from tag does not exists
func UASReadRequestDialogID ¶ added in v0.21.0
UASReadRequestDialogID creates dialog ID of message if receiver has UAS role. returns error if callid or to tag or from tag does not exists
func UnmarshalParams ¶ added in v0.15.0
Types ¶
type Addr ¶ added in v0.16.0
type CSeqHeader ¶
type CSeqHeader struct { SeqNo uint32 MethodName RequestMethod }
CSeq is CSeq header
func (*CSeqHeader) Name ¶
func (h *CSeqHeader) Name() string
func (*CSeqHeader) String ¶
func (h *CSeqHeader) String() string
func (*CSeqHeader) StringWrite ¶
func (h *CSeqHeader) StringWrite(buffer io.StringWriter)
func (*CSeqHeader) Value ¶
func (h *CSeqHeader) Value() string
func (*CSeqHeader) ValueStringWrite ¶
func (h *CSeqHeader) ValueStringWrite(buffer io.StringWriter)
type CallIDHeader ¶
type CallIDHeader string
CallIDHeader is a Call-ID header presentation
func (*CallIDHeader) Name ¶
func (h *CallIDHeader) Name() string
func (*CallIDHeader) String ¶
func (h *CallIDHeader) String() string
func (*CallIDHeader) StringWrite ¶
func (h *CallIDHeader) StringWrite(buffer io.StringWriter)
func (*CallIDHeader) Value ¶
func (h *CallIDHeader) Value() string
type ClientTransaction ¶
type ClientTransaction interface { Transaction // Responses returns channel with all responses for transaction Responses() <-chan *Response }
type ClientTx ¶ added in v0.16.0
type ClientTx struct {
// contains filtered or unexported fields
}
func NewClientTx ¶ added in v0.16.0
func (*ClientTx) OnTerminate ¶ added in v0.16.0
func (tx *ClientTx) OnTerminate(f FnTxTerminate)
type Connection ¶ added in v0.16.0
type Connection interface { // LocalAddr used for connection LocalAddr() net.Addr // WriteMsg marshals message and sends to socket WriteMsg(msg Message) error // Reference of connection can be increased/decreased to prevent closing to earlyss Ref(i int) int // Close decreases reference and if ref = 0 closes connection. Returns last ref. If 0 then it is closed TryClose() (int, error) Close() error }
type ConnectionPool ¶ added in v0.16.0
type ConnectionPool struct { // TODO consider sync.Map way with atomic checks to reduce mutex contention sync.RWMutex // contains filtered or unexported fields }
func NewConnectionPool ¶ added in v0.16.0
func NewConnectionPool() *ConnectionPool
func (*ConnectionPool) Add ¶ added in v0.16.0
func (p *ConnectionPool) Add(a string, c Connection)
func (*ConnectionPool) AddIfNotExists ¶ added in v0.18.0
func (p *ConnectionPool) AddIfNotExists(a string, c Connection)
func (*ConnectionPool) Clear ¶ added in v0.16.0
func (p *ConnectionPool) Clear()
Clear will clear all connection from pool and close them
func (*ConnectionPool) CloseAndDelete ¶ added in v0.16.0
func (p *ConnectionPool) CloseAndDelete(c Connection, addr string)
CloseAndDelete closes connection and deletes from pool
func (*ConnectionPool) Delete ¶ added in v0.18.0
func (p *ConnectionPool) Delete(addr string)
func (*ConnectionPool) DeleteMultiple ¶ added in v0.18.0
func (p *ConnectionPool) DeleteMultiple(addrs []string)
func (*ConnectionPool) Get ¶ added in v0.16.0
func (p *ConnectionPool) Get(a string) (c Connection)
Getting connection pool increases reference Make sure you TryClose after finish
func (*ConnectionPool) Size ¶ added in v0.16.0
func (p *ConnectionPool) Size() int
type ContactHeader ¶
type ContactHeader struct { // The display name from the header, may be omitted. DisplayName string Address Uri // Any parameters present in the header. Params HeaderParams }
ContactHeader is Contact header representation
func (*ContactHeader) Clone ¶
func (h *ContactHeader) Clone() *ContactHeader
func (*ContactHeader) Name ¶
func (h *ContactHeader) Name() string
func (*ContactHeader) String ¶
func (h *ContactHeader) String() string
func (*ContactHeader) StringWrite ¶
func (h *ContactHeader) StringWrite(buffer io.StringWriter)
func (*ContactHeader) Value ¶
func (h *ContactHeader) Value() string
type ContentLengthHeader ¶
type ContentLengthHeader uint32
ContentLengthHeader is Content-Length header representation
func (*ContentLengthHeader) Name ¶
func (h *ContentLengthHeader) Name() string
func (ContentLengthHeader) String ¶
func (h ContentLengthHeader) String() string
func (ContentLengthHeader) StringWrite ¶
func (h ContentLengthHeader) StringWrite(buffer io.StringWriter)
func (ContentLengthHeader) Value ¶
func (h ContentLengthHeader) Value() string
type ContentTypeHeader ¶
type ContentTypeHeader string
ContentTypeHeader is Content-Type header representation.
func (*ContentTypeHeader) Name ¶
func (h *ContentTypeHeader) Name() string
func (h **ContentTypeHeader) Name() string { return "Content-Type" }
func (*ContentTypeHeader) String ¶
func (h *ContentTypeHeader) String() string
func (*ContentTypeHeader) StringWrite ¶
func (h *ContentTypeHeader) StringWrite(buffer io.StringWriter)
func (*ContentTypeHeader) Value ¶
func (h *ContentTypeHeader) Value() string
type CopyHeader ¶
type CopyHeader interface {
// contains filtered or unexported methods
}
CopyHeader is internal interface for cloning headers. Maybe it will be full exposed later
type DialogState ¶ added in v0.15.1
type DialogState int
const ( // Dialog received 200 response DialogStateEstablished DialogState = 1 // Dialog received ACK DialogStateConfirmed DialogState = 2 // Dialog received BYE DialogStateEnded DialogState = 3 )
func (DialogState) String ¶ added in v0.16.1
func (s DialogState) String() string
type ErrorHandler ¶ added in v0.16.0
type ErrorHandler func(err error)
type ExpiresHeader ¶
type ExpiresHeader uint32
ExpiresHeader is Expires header representation
func (*ExpiresHeader) Name ¶
func (h *ExpiresHeader) Name() string
func (*ExpiresHeader) String ¶
func (h *ExpiresHeader) String() string
func (*ExpiresHeader) StringWrite ¶
func (h *ExpiresHeader) StringWrite(buffer io.StringWriter)
func (ExpiresHeader) Value ¶
func (h ExpiresHeader) Value() string
type FnTxTerminate ¶ added in v0.16.0
type FnTxTerminate func(key string)
type FromHeader ¶
type FromHeader struct { // The display name from the header, may be omitted. DisplayName string Address Uri // Any parameters present in the header. Params HeaderParams }
func (*FromHeader) AsTo ¶ added in v0.23.0
func (h *FromHeader) AsTo() ToHeader
func (*FromHeader) Name ¶
func (h *FromHeader) Name() string
func (*FromHeader) String ¶
func (h *FromHeader) String() string
func (*FromHeader) StringWrite ¶
func (h *FromHeader) StringWrite(buffer io.StringWriter)
func (*FromHeader) Value ¶
func (h *FromHeader) Value() string
func (*FromHeader) ValueStringWrite ¶
func (h *FromHeader) ValueStringWrite(buffer io.StringWriter)
type Header ¶
type Header interface { // Name returns underlying header name. Name() string Value() string String() string // StringWrite is better way to reuse single buffer StringWrite(w io.StringWriter) // contains filtered or unexported methods }
Header is a single SIP header.
func HeaderClone ¶
HeaderClone is generic function for cloning header
type HeaderParams ¶
HeaderParams are key value params. They do not provide order by default due to performance reasons
func (HeaderParams) Add ¶
func (hp HeaderParams) Add(key string, val string) HeaderParams
Add will add new key:val. If key exists it will be overwriten
func (HeaderParams) Clone ¶
func (hp HeaderParams) Clone() HeaderParams
Clone returns underneath map copied
func (HeaderParams) Equals ¶
func (hp HeaderParams) Equals(other interface{}) bool
Equals check if two maps of parameters are equal in the sense of having the same keys with the same values. This does not rely on any ordering of the keys of the map in memory.
func (HeaderParams) Get ¶
func (hp HeaderParams) Get(key string) (string, bool)
Get returns existing key
func (HeaderParams) Items ¶
func (hp HeaderParams) Items() map[string]string
Items returns the entire parameter map.
func (HeaderParams) Keys ¶
func (hp HeaderParams) Keys() []string
Keys return a slice of keys, in order.
func (HeaderParams) Remove ¶
func (hp HeaderParams) Remove(key string) HeaderParams
Remove removes param with exact key
func (HeaderParams) String ¶
func (hp HeaderParams) String() string
String returns params joined with '&' char.
func (HeaderParams) ToString ¶
func (hp HeaderParams) ToString(sep uint8) string
ToString renders params to a string. Note that this does not escape special characters, this should already have been done before calling this method.
func (HeaderParams) ToStringWrite ¶
func (hp HeaderParams) ToStringWrite(sep uint8, buffer io.StringWriter)
ToStringWrite is same as ToString but it stores to defined buffer instead returning string
type HeaderParser ¶ added in v0.15.0
A HeaderParser is any function that turns raw header data into one or more Header objects.
type MaxForwardsHeader ¶
type MaxForwardsHeader uint32
MaxForwardsHeader is Max-Forwards header representation
func (*MaxForwardsHeader) Dec ¶ added in v0.9.0
func (h *MaxForwardsHeader) Dec()
func (*MaxForwardsHeader) Name ¶
func (h *MaxForwardsHeader) Name() string
func (*MaxForwardsHeader) String ¶
func (h *MaxForwardsHeader) String() string
func (*MaxForwardsHeader) StringWrite ¶
func (h *MaxForwardsHeader) StringWrite(buffer io.StringWriter)
func (MaxForwardsHeader) Val ¶ added in v0.9.0
func (h MaxForwardsHeader) Val() uint32
func (*MaxForwardsHeader) Value ¶
func (h *MaxForwardsHeader) Value() string
type Message ¶
type Message interface { // String returns string representation of SIP message in RFC 3261 form. String() string // String write is same as String but lets you to provide writter and reduce allocations StringWrite(io.StringWriter) // GetHeaders returns slice of headers of the given type. GetHeaders(name string) []Header // PrependHeader prepends header to message. PrependHeader(header ...Header) // AppendHeader appends header to message. AppendHeader(header Header) // CallID returns 'Call-ID' header. CallID() *CallIDHeader // Via returns the top 'Via' header field. Via() *ViaHeader // From returns 'From' header field. From() *FromHeader // To returns 'To' header field. To() *ToHeader // CSeq returns 'CSeq' header field. CSeq() *CSeqHeader // Body returns message body. Body() []byte // SetBody sets message body. SetBody(body []byte) Transport() string SetTransport(tp string) Source() string SetSource(src string) Destination() string SetDestination(dest string) }
func ParseMessage ¶ added in v0.15.0
type MessageData ¶
type MessageData struct { // Set to 2.0 version by default SipVersion string // contains filtered or unexported fields }
func (*MessageData) AppendHeader ¶
func (hs *MessageData) AppendHeader(header Header)
AppendHeader adds header at end of header list
func (*MessageData) AppendHeaderAfter ¶
AppendHeaderAfter adds header after specified header. In case header does not exist normal AppendHeader is called Use it only if you need it
func (*MessageData) Body ¶
func (msg *MessageData) Body() []byte
func (*MessageData) CSeq ¶
func (hs *MessageData) CSeq() *CSeqHeader
CSeq returns underlying CSEQ parsed header or nil if not exists
func (*MessageData) CallID ¶
func (hs *MessageData) CallID() *CallIDHeader
CallID returns underlying CallID parsed header or nil if not exists
func (*MessageData) CloneHeaders ¶
func (hs *MessageData) CloneHeaders() []Header
CloneHeaders returns all cloned headers in slice.
func (*MessageData) Contact ¶
func (hs *MessageData) Contact() *ContactHeader
Contact returns underlying Contact parsed header or nil if not exists
func (*MessageData) ContentLength ¶
func (hs *MessageData) ContentLength() *ContentLengthHeader
ContentLength returns underlying Content-Length parsed header or nil if not exists
func (*MessageData) ContentType ¶
func (hs *MessageData) ContentType() *ContentTypeHeader
ContentType returns underlying Content-Type parsed header or nil if not exists
func (*MessageData) Destination ¶
func (msg *MessageData) Destination() string
func (*MessageData) From ¶
func (hs *MessageData) From() *FromHeader
From returns underlying From parsed header or nil if not exists
func (*MessageData) GetHeader ¶
GetHeader returns Header if exists, otherwise nil is returned Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*MessageData) GetHeaders ¶
GetHeaders returns list of headers with same name Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*MessageData) MaxForwards ¶ added in v0.7.2
func (hs *MessageData) MaxForwards() *MaxForwardsHeader
MaxForwards returns underlying Max-Forwards parsed header or nil if not exists
func (*MessageData) PrependHeader ¶
func (hs *MessageData) PrependHeader(headers ...Header)
PrependHeader adds header to the front of header list using as list reduces need of realloc underneath array
func (*MessageData) RecordRoute ¶
func (hs *MessageData) RecordRoute() *RecordRouteHeader
RecordRoute returns underlying Record-Route parsed header or nil if not exists
func (*MessageData) RemoveHeader ¶
RemoveHeader removes header by name
func (*MessageData) ReplaceHeader ¶
func (hs *MessageData) ReplaceHeader(header Header)
ReplaceHeader replaces first header with same name
func (*MessageData) Route ¶
func (hs *MessageData) Route() *RouteHeader
Route returns underlying Route parsed header or nil if not exists
func (*MessageData) SetBody ¶
func (msg *MessageData) SetBody(body []byte)
SetBody sets message body, calculates it length and add 'Content-Length' header.
func (*MessageData) SetDestination ¶
func (msg *MessageData) SetDestination(dest string)
func (*MessageData) SetSource ¶
func (msg *MessageData) SetSource(src string)
func (*MessageData) SetTransport ¶
func (msg *MessageData) SetTransport(tp string)
func (*MessageData) Source ¶
func (msg *MessageData) Source() string
func (*MessageData) StringWrite ¶
func (hs *MessageData) StringWrite(buffer io.StringWriter)
func (*MessageData) To ¶
func (hs *MessageData) To() *ToHeader
To returns underlying To parsed header or nil if not exists
func (*MessageData) Transport ¶
func (msg *MessageData) Transport() string
type MessageHandler ¶
type MessageHandler func(msg Message)
type Parser ¶ added in v0.8.0
type Parser struct {
// contains filtered or unexported fields
}
Parser is implementation of SIPParser It is optimized with faster header parsing
func NewParser ¶ added in v0.15.0
func NewParser(options ...ParserOption) *Parser
Create a new Parser.
func (*Parser) NewSIPStream ¶ added in v0.15.0
func (p *Parser) NewSIPStream() *ParserStream
NewSIPStream implements SIP parsing contructor for IO that stream SIP message It should be created per each stream
type ParserOption ¶ added in v0.15.0
type ParserOption func(p *Parser)
ParserOption are addition option for NewParser. Check WithParser...
func WithHeadersParsers ¶ added in v0.15.0
func WithHeadersParsers(m map[string]HeaderParser) ParserOption
WithHeadersParsers allows customizing parser headers parsers Consider performance when adding custom parser. Add only if it will appear in almost every message
Check DefaultHeadersParser as starting point
func WithParserLogger ¶ added in v0.15.0
func WithParserLogger(logger zerolog.Logger) ParserOption
WithServerLogger allows customizing parser logger
type ParserStream ¶ added in v0.15.0
type ParserStream struct {
// contains filtered or unexported fields
}
func (*ParserStream) ParseSIPStream ¶ added in v0.15.0
func (p *ParserStream) ParseSIPStream(data []byte) (msgs []Message, err error)
ParseSIPStream parsing messages comming in stream It has slight overhead vs parsing full message
type RecordRouteHeader ¶
type RecordRouteHeader struct {
Address Uri
}
RecordRouteHeader is Record-Route header representation.
func (*RecordRouteHeader) Clone ¶
func (h *RecordRouteHeader) Clone() *RecordRouteHeader
func (*RecordRouteHeader) Name ¶
func (h *RecordRouteHeader) Name() string
func (*RecordRouteHeader) String ¶
func (h *RecordRouteHeader) String() string
func (*RecordRouteHeader) StringWrite ¶
func (h *RecordRouteHeader) StringWrite(buffer io.StringWriter)
func (*RecordRouteHeader) Value ¶
func (h *RecordRouteHeader) Value() string
func (*RecordRouteHeader) ValueStringWrite ¶
func (h *RecordRouteHeader) ValueStringWrite(buffer io.StringWriter)
type Request ¶
type Request struct { MessageData Method RequestMethod Recipient Uri }
Request RFC 3261 - 7.1.
func CopyRequest ¶
func NewAckRequest ¶
NewAckRequest creates ACK request for 2xx INVITE https://tools.ietf.org/html/rfc3261#section-13.2.2.4 NOTE: it does not copy Via header. This is left to transport or caller to enforce Deprecated: use DialogClient for building dialogs
func NewRequest ¶
func NewRequest(method RequestMethod, recipient Uri) *Request
NewRequest creates base for building sip Request A Request-Line contains a method name, a Request-URI, and the SIP/2.0 as version No headers are added. AppendHeader should be called to add Headers. r.SetBody can be called to set proper ContentLength header
func (*Request) AppendHeader ¶
func (hs *Request) AppendHeader(header Header)
AppendHeader adds header at end of header list
func (*Request) AppendHeaderAfter ¶
AppendHeaderAfter adds header after specified header. In case header does not exist normal AppendHeader is called Use it only if you need it
func (*Request) CSeq ¶
func (hs *Request) CSeq() *CSeqHeader
CSeq returns underlying CSEQ parsed header or nil if not exists
func (*Request) CallID ¶
func (hs *Request) CallID() *CallIDHeader
CallID returns underlying CallID parsed header or nil if not exists
func (*Request) CloneHeaders ¶
func (hs *Request) CloneHeaders() []Header
CloneHeaders returns all cloned headers in slice.
func (*Request) Contact ¶
func (hs *Request) Contact() *ContactHeader
Contact returns underlying Contact parsed header or nil if not exists
func (*Request) ContentLength ¶
func (hs *Request) ContentLength() *ContentLengthHeader
ContentLength returns underlying Content-Length parsed header or nil if not exists
func (*Request) ContentType ¶
func (hs *Request) ContentType() *ContentTypeHeader
ContentType returns underlying Content-Type parsed header or nil if not exists
func (*Request) Destination ¶
TODO: return Addr instead string, to remove double string parsing
func (*Request) From ¶
func (hs *Request) From() *FromHeader
From returns underlying From parsed header or nil if not exists
func (*Request) GetHeader ¶
GetHeader returns Header if exists, otherwise nil is returned Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*Request) GetHeaders ¶
GetHeaders returns list of headers with same name Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*Request) MaxForwards ¶ added in v0.7.2
func (hs *Request) MaxForwards() *MaxForwardsHeader
MaxForwards returns underlying Max-Forwards parsed header or nil if not exists
func (*Request) PrependHeader ¶
func (hs *Request) PrependHeader(headers ...Header)
PrependHeader adds header to the front of header list using as list reduces need of realloc underneath array
func (*Request) RecordRoute ¶
func (hs *Request) RecordRoute() *RecordRouteHeader
RecordRoute returns underlying Record-Route parsed header or nil if not exists
func (*Request) RemoveHeader ¶
RemoveHeader removes header by name
func (*Request) ReplaceHeader ¶
func (hs *Request) ReplaceHeader(header Header)
ReplaceHeader replaces first header with same name
func (*Request) Route ¶
func (hs *Request) Route() *RouteHeader
Route returns underlying Route parsed header or nil if not exists
func (*Request) Source ¶
Source will return host:port address In case of network parsed request source will be connection remote address
func (*Request) StartLineWrite ¶
func (req *Request) StartLineWrite(buffer io.StringWriter)
func (*Request) StringWrite ¶
func (req *Request) StringWrite(buffer io.StringWriter)
type RequestHandler ¶ added in v0.16.0
type RequestHandler func(req *Request, tx ServerTransaction)
type RequestMethod ¶
type RequestMethod string
const ( INVITE RequestMethod = "INVITE" ACK RequestMethod = "ACK" CANCEL RequestMethod = "CANCEL" BYE RequestMethod = "BYE" REGISTER RequestMethod = "REGISTER" OPTIONS RequestMethod = "OPTIONS" SUBSCRIBE RequestMethod = "SUBSCRIBE" NOTIFY RequestMethod = "NOTIFY" REFER RequestMethod = "REFER" INFO RequestMethod = "INFO" MESSAGE RequestMethod = "MESSAGE" PRACK RequestMethod = "PRACK" UPDATE RequestMethod = "UPDATE" PUBLISH RequestMethod = "PUBLISH" )
method names are defined here as constants for convenience.
func (RequestMethod) String ¶
func (r RequestMethod) String() string
type Response ¶
type Response struct { MessageData Reason string // e.g. "200 OK" StatusCode StatusCode // e.g. 200 }
Response RFC 3261 - 7.2.
func CopyResponse ¶
func NewResponse ¶
func NewResponse( statusCode StatusCode, reason string, ) *Response
NewResponse creates base structure of response.
func NewResponseFromRequest ¶
func NewResponseFromRequest( req *Request, statusCode StatusCode, reason string, body []byte, ) *Response
RFC 3261 - 8.2.6
func NewSDPResponseFromRequest ¶ added in v0.13.1
NewSDPResponseFromRequest is wrapper for 200 response with SDP body
func (*Response) AppendHeader ¶
func (hs *Response) AppendHeader(header Header)
AppendHeader adds header at end of header list
func (*Response) AppendHeaderAfter ¶
AppendHeaderAfter adds header after specified header. In case header does not exist normal AppendHeader is called Use it only if you need it
func (*Response) CSeq ¶
func (hs *Response) CSeq() *CSeqHeader
CSeq returns underlying CSEQ parsed header or nil if not exists
func (*Response) CallID ¶
func (hs *Response) CallID() *CallIDHeader
CallID returns underlying CallID parsed header or nil if not exists
func (*Response) CloneHeaders ¶
func (hs *Response) CloneHeaders() []Header
CloneHeaders returns all cloned headers in slice.
func (*Response) Contact ¶
func (hs *Response) Contact() *ContactHeader
Contact returns underlying Contact parsed header or nil if not exists
func (*Response) ContentLength ¶
func (hs *Response) ContentLength() *ContentLengthHeader
ContentLength returns underlying Content-Length parsed header or nil if not exists
func (*Response) ContentType ¶
func (hs *Response) ContentType() *ContentTypeHeader
ContentType returns underlying Content-Type parsed header or nil if not exists
func (*Response) Destination ¶
Destination will return host:port address In case of building response from request, request source is set as destination This will sent response over same connection if request is parsed from network
func (*Response) From ¶
func (hs *Response) From() *FromHeader
From returns underlying From parsed header or nil if not exists
func (*Response) GetHeader ¶
GetHeader returns Header if exists, otherwise nil is returned Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*Response) GetHeaders ¶
GetHeaders returns list of headers with same name Use lower case to avoid allocs Headers are pointers, always Clone them for change
func (*Response) IsClientError ¶
func (*Response) IsGlobalError ¶
func (*Response) IsProvisional ¶
func (*Response) IsRedirection ¶
func (*Response) IsServerError ¶
func (*Response) MaxForwards ¶ added in v0.7.2
func (hs *Response) MaxForwards() *MaxForwardsHeader
MaxForwards returns underlying Max-Forwards parsed header or nil if not exists
func (*Response) PrependHeader ¶
func (hs *Response) PrependHeader(headers ...Header)
PrependHeader adds header to the front of header list using as list reduces need of realloc underneath array
func (*Response) RecordRoute ¶
func (hs *Response) RecordRoute() *RecordRouteHeader
RecordRoute returns underlying Record-Route parsed header or nil if not exists
func (*Response) RemoveHeader ¶
RemoveHeader removes header by name
func (*Response) ReplaceHeader ¶
func (hs *Response) ReplaceHeader(header Header)
ReplaceHeader replaces first header with same name
func (*Response) Route ¶
func (hs *Response) Route() *RouteHeader
Route returns underlying Route parsed header or nil if not exists
func (*Response) StartLineWrite ¶
func (res *Response) StartLineWrite(buffer io.StringWriter)
func (*Response) StringWrite ¶
func (res *Response) StringWrite(buffer io.StringWriter)
type RouteHeader ¶
type RouteHeader struct {
Address Uri
}
RouteHeader is Route header representation.
func (*RouteHeader) Clone ¶
func (h *RouteHeader) Clone() *RouteHeader
func (*RouteHeader) Name ¶
func (h *RouteHeader) Name() string
func (*RouteHeader) String ¶
func (h *RouteHeader) String() string
func (*RouteHeader) StringWrite ¶
func (h *RouteHeader) StringWrite(buffer io.StringWriter)
func (*RouteHeader) Value ¶
func (h *RouteHeader) Value() string
func (*RouteHeader) ValueStringWrite ¶
func (h *RouteHeader) ValueStringWrite(buffer io.StringWriter)
type ServerTransaction ¶
type ServerTransaction interface { Transaction // Respond sends response. It is expected that is prebuilt with correct headers // Use NewResponseFromRequest to build response Respond(res *Response) error // Acks returns ACK during transaction. Acks() <-chan *Request }
type ServerTx ¶ added in v0.16.0
type ServerTx struct {
// contains filtered or unexported fields
}
func NewServerTx ¶ added in v0.16.0
func (*ServerTx) Acks ¶ added in v0.16.0
Acks makes channel for sending acks. Channel is created on demand
func (*ServerTx) OnTerminate ¶ added in v0.16.0
func (tx *ServerTx) OnTerminate(f FnTxTerminate)
type StatusCode ¶
type StatusCode int
StatusCode - response status code: 1xx - 6xx
const ( // https://datatracker.ietf.org/doc/html/rfc3261#section-21 StatusTrying StatusCode = 100 StatusRinging StatusCode = 180 StatusCallIsForwarded StatusCode = 181 StatusQueued StatusCode = 182 StatusSessionInProgress StatusCode = 183 StatusOK StatusCode = 200 StatusAccepted StatusCode = 202 StatusMovedPermanently StatusCode = 301 StatusMovedTemporarily StatusCode = 302 StatusUseProxy StatusCode = 305 StatusBadRequest StatusCode = 400 StatusPaymentRequired StatusCode = 402 StatusForbidden StatusCode = 403 StatusNotFound StatusCode = 404 StatusMethodNotAllowed StatusCode = 405 StatusNotAcceptable StatusCode = 406 StatusProxyAuthRequired StatusCode = 407 StatusRequestTimeout StatusCode = 408 StatusConflict StatusCode = 409 StatusGone StatusCode = 410 StatusRequestEntityTooLarge StatusCode = 413 StatusRequestURITooLong StatusCode = 414 StatusUnsupportedMediaType StatusCode = 415 StatusRequestedRangeNotSatisfiable StatusCode = 416 StatusBadExtension StatusCode = 420 StatusExtensionRequired StatusCode = 421 StatusIntervalToBrief StatusCode = 423 StatusCallTransactionDoesNotExists StatusCode = 481 StatusLoopDetected StatusCode = 482 StatusTooManyHops StatusCode = 483 StatusAddressIncomplete StatusCode = 484 StatusAmbiguous StatusCode = 485 StatusBusyHere StatusCode = 486 StatusRequestTerminated StatusCode = 487 StatusNotAcceptableHere StatusCode = 488 StatusInternalServerError StatusCode = 500 StatusNotImplemented StatusCode = 501 StatusBadGateway StatusCode = 502 StatusGatewayTimeout StatusCode = 504 StatusVersionNotSupported StatusCode = 505 StatusMessageTooLarge StatusCode = 513 StatusGlobalBusyEverywhere StatusCode = 600 StatusGlobalDecline StatusCode = 603 StatusGlobalDoesNotExistAnywhere StatusCode = 604 StatusGlobalNotAcceptable StatusCode = 606 )
type TCPConnection ¶ added in v0.16.0
func (*TCPConnection) Close ¶ added in v0.16.0
func (c *TCPConnection) Close() error
func (*TCPConnection) Read ¶ added in v0.16.0
func (c *TCPConnection) Read(b []byte) (n int, err error)
func (*TCPConnection) Ref ¶ added in v0.16.0
func (c *TCPConnection) Ref(i int) int
func (*TCPConnection) TryClose ¶ added in v0.16.0
func (c *TCPConnection) TryClose() (int, error)
func (*TCPConnection) Write ¶ added in v0.16.0
func (c *TCPConnection) Write(b []byte) (n int, err error)
func (*TCPConnection) WriteMsg ¶ added in v0.16.0
func (c *TCPConnection) WriteMsg(msg Message) error
type ToHeader ¶
type ToHeader struct { // The display name from the header, may be omitted. DisplayName string Address Uri // Any parameters present in the header. Params HeaderParams }
ToHeader introduces SIP 'To' header
func (*ToHeader) AsFrom ¶ added in v0.23.0
func (h *ToHeader) AsFrom() FromHeader
func (*ToHeader) StringWrite ¶
func (h *ToHeader) StringWrite(buffer io.StringWriter)
func (*ToHeader) ValueStringWrite ¶
func (h *ToHeader) ValueStringWrite(buffer io.StringWriter)
type Transaction ¶
type Transaction interface { // Terminate will terminate transaction Terminate() // Done when transaction fsm terminates. Can be called multiple times Done() <-chan struct{} // Last error. Useful to check when transaction terminates Err() error }
type TransactionLayer ¶ added in v0.16.0
type TransactionLayer struct {
// contains filtered or unexported fields
}
func NewTransactionLayer ¶ added in v0.16.0
func NewTransactionLayer(tpl *TransportLayer) *TransactionLayer
func (*TransactionLayer) Close ¶ added in v0.16.0
func (txl *TransactionLayer) Close()
func (*TransactionLayer) OnRequest ¶ added in v0.16.0
func (txl *TransactionLayer) OnRequest(h RequestHandler)
func (*TransactionLayer) Respond ¶ added in v0.16.0
func (txl *TransactionLayer) Respond(res *Response) (*ServerTx, error)
func (*TransactionLayer) Transport ¶ added in v0.16.0
func (txl *TransactionLayer) Transport() *TransportLayer
func (*TransactionLayer) UnhandledResponseHandler ¶ added in v0.16.0
func (txl *TransactionLayer) UnhandledResponseHandler(f UnhandledResponseHandler)
UnhandledResponseHandler can be used in case missing client transactions for handling response ServerTransaction handle responses by state machine
type Transport ¶
type Transport interface { Network() string // GetConnection returns connection from transport // addr must be resolved to IP:port GetConnection(addr string) (Connection, error) CreateConnection(ctx context.Context, laddr Addr, raddr Addr, handler MessageHandler) (Connection, error) String() string Close() error }
Protocol implements network specific features.
type TransportLayer ¶ added in v0.16.0
type TransportLayer struct { // ConnectionReuse will force connection reuse when passing request ConnectionReuse bool // PreferSRV does always SRV lookup first DNSPreferSRV bool // contains filtered or unexported fields }
TransportLayer implementation.
func NewTransportLayer ¶ added in v0.16.0
func NewTransportLayer( dnsResolver *net.Resolver, sipparser *Parser, tlsConfig *tls.Config, ) *TransportLayer
NewLayer creates transport layer. dns Resolver sip parser tls config - can be nil to use default tls
func (*TransportLayer) ClientRequestConnection ¶ added in v0.16.0
func (l *TransportLayer) ClientRequestConnection(ctx context.Context, req *Request) (c Connection, err error)
ClientRequestConnection is based on https://www.rfc-editor.org/rfc/rfc3261#section-18.1.1 It is wrapper for getting and creating connection
In case req destination is DNS resolved, destination will be cached or in other words SetDestination will be called
func (*TransportLayer) Close ¶ added in v0.16.0
func (l *TransportLayer) Close() error
func (*TransportLayer) GetConnection ¶ added in v0.16.0
func (l *TransportLayer) GetConnection(network, addr string) (Connection, error)
GetConnection gets existing or creates new connection based on addr
func (*TransportLayer) GetListenPort ¶ added in v0.16.0
func (l *TransportLayer) GetListenPort(network string) int
func (*TransportLayer) OnMessage ¶ added in v0.16.0
func (l *TransportLayer) OnMessage(h MessageHandler)
OnMessage is main function which will be called on any new message by transport layer Consider there is no concurency and you need to make sure that you do not block too long This is intentional as higher concurency can slow things
func (*TransportLayer) ServeTCP ¶ added in v0.16.0
func (l *TransportLayer) ServeTCP(c net.Listener) error
ServeTCP will listen on tcp connection
func (*TransportLayer) ServeTLS ¶ added in v0.16.0
func (l *TransportLayer) ServeTLS(c net.Listener) error
ServeTLS will listen on tcp connection
func (*TransportLayer) ServeUDP ¶ added in v0.16.0
func (l *TransportLayer) ServeUDP(c net.PacketConn) error
ServeUDP will listen on udp connection
func (*TransportLayer) ServeWS ¶ added in v0.16.0
func (l *TransportLayer) ServeWS(c net.Listener) error
ServeWS will listen on ws connection
func (*TransportLayer) ServeWSS ¶ added in v0.16.0
func (l *TransportLayer) ServeWSS(c net.Listener) error
ServeWSS will listen on wss connection
func (*TransportLayer) WriteMsg ¶ added in v0.16.0
func (l *TransportLayer) WriteMsg(msg Message) error
func (*TransportLayer) WriteMsgTo ¶ added in v0.16.0
func (l *TransportLayer) WriteMsgTo(msg Message, addr string, network string) error
type UDPConnection ¶ added in v0.16.0
type UDPConnection struct { // mutual exclusive for now to avoid interface for Read // TODO Refactor PacketConn net.PacketConn PacketAddr string // For faster matching Listener bool Conn net.Conn // contains filtered or unexported fields }
func (*UDPConnection) Close ¶ added in v0.16.0
func (c *UDPConnection) Close() error
func (*UDPConnection) LocalAddr ¶ added in v0.16.0
func (c *UDPConnection) LocalAddr() net.Addr
func (*UDPConnection) Read ¶ added in v0.16.0
func (c *UDPConnection) Read(b []byte) (n int, err error)
func (*UDPConnection) Ref ¶ added in v0.16.0
func (c *UDPConnection) Ref(i int) int
func (*UDPConnection) RemoteAddr ¶ added in v0.18.0
func (c *UDPConnection) RemoteAddr() net.Addr
func (*UDPConnection) TryClose ¶ added in v0.16.0
func (c *UDPConnection) TryClose() (int, error)
func (*UDPConnection) Write ¶ added in v0.16.0
func (c *UDPConnection) Write(b []byte) (n int, err error)
func (*UDPConnection) WriteMsg ¶ added in v0.16.0
func (c *UDPConnection) WriteMsg(msg Message) error
type UnhandledResponseHandler ¶ added in v0.16.0
type UnhandledResponseHandler func(req *Response)
type Uri ¶
type Uri struct { Scheme string // If value is star (*) Wildcard bool // if // is present HierarhicalSlashes bool // The user part of the URI: the 'joe' in sip:joe@bloggs.com User string // The password field of the URI. This is represented in the URI as joe:hunter2@bloggs.com. // Note that if a URI has a password field, it *must* have a user field as well. // Note that RFC 3261 strongly recommends against the use of password fields in SIP URIs, // as they are fundamentally insecure. Password string // The host part of the URI. This can be a domain, or a string representation of an IP address. Host string // The port part of the URI. This is optional, and can be empty. Port int // Any parameters associated with the URI. // These are used to provide information about requests that may be constructed from the URI. // (For more details, see RFC 3261 section 19.1.1). // These appear as a semicolon-separated list of key=value pairs following the host[:port] part. UriParams HeaderParams // Any headers to be included on requests constructed from this URI. // These appear as a '&'-separated list at the end of the URI, introduced by '?'. Headers HeaderParams }
Uri is parsed form of sip:user:password@host:port;uri-parameters?headers In case of `sips:“ Encrypted is set to true
func (*Uri) Addr ¶ added in v0.11.1
Addr is uri part without headers and params. sip[s]:user@host[:port]
func (*Uri) IsEncrypted ¶
IsEncrypted returns true if uri is SIPS uri
func (*Uri) StringWrite ¶
func (uri *Uri) StringWrite(buffer io.StringWriter)
StringWrite writes uri string to buffer
type ViaHeader ¶
type ViaHeader struct { // E.g. 'SIP'. ProtocolName string // E.g. '2.0'. ProtocolVersion string Transport string // TODO consider changing Host Port as struct Addr from transport Host string Port int // This is optional Params HeaderParams }
ViaHeader is Via header representation. It can be linked list of multiple via if they are part of one header
func (*ViaHeader) StringWrite ¶
func (h *ViaHeader) StringWrite(buffer io.StringWriter)
func (*ViaHeader) ValueStringWrite ¶
func (h *ViaHeader) ValueStringWrite(buffer io.StringWriter)
type WSConnection ¶ added in v0.16.0
func (*WSConnection) Close ¶ added in v0.16.0
func (c *WSConnection) Close() error
func (*WSConnection) Read ¶ added in v0.16.0
func (c *WSConnection) Read(b []byte) (n int, err error)
func (*WSConnection) Ref ¶ added in v0.16.0
func (c *WSConnection) Ref(i int) int
func (*WSConnection) TryClose ¶ added in v0.16.0
func (c *WSConnection) TryClose() (int, error)
func (*WSConnection) Write ¶ added in v0.16.0
func (c *WSConnection) Write(b []byte) (n int, err error)
func (*WSConnection) WriteMsg ¶ added in v0.16.0
func (c *WSConnection) WriteMsg(msg Message) error
Source Files ¶
- dialog.go
- header_params.go
- headers.go
- message.go
- parse_address.go
- parse_header.go
- parse_params.go
- parse_uri.go
- parse_via.go
- parser.go
- parser_stream.go
- request.go
- response.go
- sip.go
- transaction.go
- transaction_client_tx.go
- transaction_client_tx_fsm.go
- transaction_fsm.go
- transaction_layer.go
- transaction_server_tx.go
- transaction_server_tx_fsm.go
- transport.go
- transport_connection_pool.go
- transport_layer.go
- transport_tcp.go
- transport_tls.go
- transport_udp.go
- transport_ws.go
- transport_wss.go
- uri.go
- utils.go