module Network.DNS.Decode (
decode
, decodeMany
, decodeResourceRecord
, decodeDNSHeader
, decodeDNSFlags
, decodeDomain
, decodeMailbox
) where
import Control.Applicative (many)
import Data.ByteString (ByteString)
import Network.DNS.StateBinary
import Network.DNS.Types
import Network.DNS.Decode.Internal
#if __GLASGOW_HASKELL__ < 709
import Control.Applicative
#endif
decode :: ByteString -> Either String DNSMessage
decode bs = fst <$> runSGet getResponse bs
decodeMany :: ByteString -> Either String ([DNSMessage], ByteString)
decodeMany bs = do
((bss, _), leftovers) <- runSGetWithLeftovers lengthEncoded bs
msgs <- mapM decode bss
return (msgs, leftovers)
where
lengthEncoded :: SGet [ByteString]
lengthEncoded = many $ do
len <- getInt16
getNByteString len
decodeDNSFlags :: ByteString -> Either String DNSFlags
decodeDNSFlags bs = fst <$> runSGet getDNSFlags bs
decodeDNSHeader :: ByteString -> Either String DNSHeader
decodeDNSHeader bs = fst <$> runSGet getHeader bs
decodeDomain :: ByteString -> Either String Domain
decodeDomain bs = fst <$> runSGet getDomain bs
decodeMailbox :: ByteString -> Either String Mailbox
decodeMailbox bs = fst <$> runSGet getMailbox bs
decodeResourceRecord :: ByteString -> Either String ResourceRecord
decodeResourceRecord bs = fst <$> runSGet getResourceRecord bs