@@ -52,8 +52,18 @@ defmodule ExSDP.Origin do
5252 end
5353
5454 @ spec parse ( binary ( ) ) ::
55- { :ok , t ( ) } | { :error , :invalid_addrtype | :invalid_address }
56- def parse ( origin ) do
55+ { :ok , t ( ) }
56+ | { :error , :invalid_addrtype | :invalid_address | :too_few_fields | :too_many_fields }
57+ def parse ( origin_binary ) do
58+ with { :ok , origin } <- do_parse ( origin_binary , 6 ) do
59+ { :ok , origin }
60+ else
61+ { :error , :too_many_fields } -> do_parse ( origin_binary , 7 )
62+ error -> error
63+ end
64+ end
65+
66+ defp do_parse ( origin , 6 ) do
5767 with { :ok , [ username , sess_id , sess_version , nettype , addrtype , address ] } <-
5868 Utils . split ( origin , " " , 6 ) ,
5969 { :ok , addrtype } <- Address . parse_addrtype ( addrtype ) ,
@@ -75,6 +85,29 @@ defmodule ExSDP.Origin do
7585 end
7686 end
7787
88+ # a workaround to support SDP sent by Tapo C320WS camera which puts an additional junk byte in the origin attribute
89+ defp do_parse ( origin , 7 ) do
90+ with { :ok , [ username , sess_id , sess_version , _junk , nettype , addrtype , address ] } <-
91+ Utils . split ( origin , " " , 7 ) ,
92+ { :ok , addrtype } <- Address . parse_addrtype ( addrtype ) ,
93+ { :ok , address } <- Address . parse_address ( address ) do
94+ # check whether fqdn
95+ address = if is_binary ( address ) , do: { addrtype , address } , else: address
96+
97+ origin = % __MODULE__ {
98+ username: username ,
99+ session_id: String . to_integer ( sess_id ) ,
100+ session_version: String . to_integer ( sess_version ) ,
101+ network_type: nettype ,
102+ address: address
103+ }
104+
105+ { :ok , origin }
106+ else
107+ { :error , _reason } = error -> error
108+ end
109+ end
110+
78111 @ doc """
79112 Increments `session_version` field.
80113
0 commit comments