Packages
sippet
1.0.6
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/message/request_line.ex
defmodule Sippet.Message.RequestLine do
@moduledoc """
A SIP Request-Line struct, composed by the Method, Request-URI and
SIP-Version.
The `start_line` of requests are represented by this struct. The RFC 3261
represents the Request-Line as:
Request-Line = Method SP Request-URI SP SIP-Version CRLF
The above `Method` is represented by atoms, when the method is a known one,
or by binaries, when the method is unknown. Known ones are `:ack`, `:invite`,
`:register`, `:cancel`, `:message` and all others returned by the function
`Sippet.Message.known_methods/0`.
The `Request-URI` is represented by a `Sippet.URI` struct, breaking down the
SIP-URI in more useful parts for processing.
The `SIP-Version` is a `{major, minor}` tuple, which assumes the value
`{2, 0}` in standard implementations.
"""
alias Sippet.URI, as: URI
defstruct [
method: nil,
request_uri: nil,
version: {2, 0}
]
@type method :: Sippet.Message.method
@type uri :: URI.t
@type version :: {integer, integer}
@type t :: %__MODULE__{
method: method,
request_uri: uri,
version: version
}
@doc """
Creates a Request-Line struct.
The version will assume the default value `{2, 0}`.
"""
@spec new(method, uri | binary) :: t
def new(method, %URI{} = request_uri)
when is_atom(method) or is_binary(method) do
%__MODULE__{
method: method,
request_uri: request_uri,
}
end
def new(method, request_uri)
when is_binary(request_uri) do
new(method, URI.parse!(request_uri))
end
@doc """
Returns a binary which corresponds to the text representation of the given
Request-Line.
It does not includes an ending line CRLF.
"""
@spec to_string(t) :: binary
defdelegate to_string(value), to: String.Chars.Sippet.Message.RequestLine
@doc """
Returns an iodata which corresponds to the text representation of the given
Request-Line.
It does not includes an ending line CRLF.
"""
@spec to_iodata(t) :: iodata
def to_iodata(%Sippet.Message.RequestLine{version: {major, minor},
request_uri: uri, method: method}) do
[if(is_atom(method), do: String.upcase(Atom.to_string(method)), else: method),
" ", Sippet.URI.to_string(uri),
" SIP/", Integer.to_string(major), ".", Integer.to_string(minor)]
end
end
defimpl String.Chars, for: Sippet.Message.RequestLine do
alias Sippet.Message.RequestLine, as: RequestLine
def to_string(%RequestLine{} = request_line) do
request_line
|> RequestLine.to_iodata()
|> IO.iodata_to_binary
end
end