dns-3.0.0: Network/DNS/Decode.hs
{-# LANGUAGE CPP #-}
-- | Decoders for DNS.
module Network.DNS.Decode (
-- * Decoder
decode
, decodeMany
-- ** Decoder for Each Part
, 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
----------------------------------------------------------------
-- | Decoding DNS query or response.
decode :: ByteString -> Either String DNSMessage
decode bs = fst <$> runSGet getResponse bs
-- | Parse many length-encoded DNS records, for example, from TCP traffic.
decodeMany :: ByteString -> Either String ([DNSMessage], ByteString)
decodeMany bs = do
((bss, _), leftovers) <- runSGetWithLeftovers lengthEncoded bs
msgs <- mapM decode bss
return (msgs, leftovers)
where
-- Read a list of length-encoded lazy bytestrings
lengthEncoded :: SGet [ByteString]
lengthEncoded = many $ do
len <- getInt16
getNByteString len
-- | Decoding DNS flags.
decodeDNSFlags :: ByteString -> Either String DNSFlags
decodeDNSFlags bs = fst <$> runSGet getDNSFlags bs
-- | Decoding DNS header.
decodeDNSHeader :: ByteString -> Either String DNSHeader
decodeDNSHeader bs = fst <$> runSGet getHeader bs
-- | Decoding domain.
decodeDomain :: ByteString -> Either String Domain
decodeDomain bs = fst <$> runSGet getDomain bs
-- | Decoding mailbox.
decodeMailbox :: ByteString -> Either String Mailbox
decodeMailbox bs = fst <$> runSGet getMailbox bs
-- | Decoding resource record.
decodeResourceRecord :: ByteString -> Either String ResourceRecord
decodeResourceRecord bs = fst <$> runSGet getResourceRecord bs