Packages
sippet
0.4.1
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
An Elixir Session Initiation Protocol (SIP) stack.
Current section
Files
Jump to
Current section
Files
lib/sippet/transactions/server/key.ex
defmodule Sippet.Transactions.Server.Key do
@moduledoc """
Defines a key in which server transactions are uniquely identified.
"""
alias Sippet.Message, as: Message
alias Sippet.Message.RequestLine, as: RequestLine
alias Sippet.Message.StatusLine, as: StatusLine
@typedoc "The topmost Via header branch parameter"
@type branch :: binary
@typedoc "The topmost Via header sent-by parameter"
@type sentby :: {shost :: binary, sport :: integer}
@type t :: %__MODULE__{
branch: binary,
method: Message.method,
sentby: sentby
}
defstruct [
branch: nil,
method: nil,
sentby: nil
]
@doc """
Creates a server transaction identifier.
"""
@spec new(branch, Message.method, sentby) :: t
def new(branch, method, sentby) do
%__MODULE__{
branch: branch,
method: method,
sentby: sentby
}
end
@doc """
Creates a server transaction identifier from an incoming request or an
outgoing response. If they are related, they will be equal.
"""
@spec new(Message.t) :: t
def new(%Message{start_line: %RequestLine{}} = incoming_request) do
method = incoming_request.start_line.method
# Take the topmost via branch
{_version, _protocol, sentby, %{"branch" => branch}} =
hd(incoming_request.headers.via)
new(branch, method, sentby)
end
def new(%Message{start_line: %StatusLine{}} = outgoing_response) do
{_sequence, method} = outgoing_response.headers.cseq
# Take the topmost via sent-by and branch
{_version, _protocol, sentby, %{"branch" => branch}} =
hd(outgoing_response.headers.via)
new(branch, method, sentby)
end
end
defimpl String.Chars, for: Sippet.Transactions.Server.Key do
def to_string(%Sippet.Transactions.Server.Key{} = key) do
{host, port} = key.sentby
"#{key.branch}/#{key.method}/#{host}:#{port}"
end
end