diff options
author | Kazu Yamamoto <kazu@iij.ad.jp> | 2011-08-30 16:23:07 +0900 |
---|---|---|
committer | Kazu Yamamoto <kazu@iij.ad.jp> | 2011-08-30 16:23:07 +0900 |
commit | 597ae83b60dd28706cd29e4df5c69204a4b983a8 (patch) | |
tree | 8e9f365f73871831a3b33d5f1817384a6d7b286c /Network/DNS/Response.hs | |
parent | 8ba004e4135783c2a3c79e057c553fa01fb87a57 (diff) |
attoparsec + enumerator.
Diffstat (limited to 'Network/DNS/Response.hs')
-rw-r--r-- | Network/DNS/Response.hs | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/Network/DNS/Response.hs b/Network/DNS/Response.hs index 629cd92..d746fc2 100644 --- a/Network/DNS/Response.hs +++ b/Network/DNS/Response.hs @@ -1,20 +1,25 @@ {-# LANGUAGE OverloadedStrings #-} -module Network.DNS.Response (parseResponse) where +module Network.DNS.Response (responseIter, parseResponse) where +import Control.Applicative import Control.Monad import Data.Bits import qualified Data.ByteString.Char8 as BS -import qualified Data.ByteString.Lazy.Char8 as L import Data.IP import Data.Maybe import Network.DNS.Internal import Network.DNS.StateBinary +import Data.Enumerator (Enumerator, Iteratee, run_, ($$)) +import Data.ByteString (ByteString) ----------------------------------------------------------------- +responseIter :: Iteratee ByteString IO (DNSFormat, PState) +responseIter = runSGet decodeResponse -parseResponse :: L.ByteString -> DNSFormat -parseResponse = runSGet decodeResponse +parseResponse :: Enumerator ByteString IO (a,b) + -> Iteratee ByteString IO (a,b) + -> IO a +parseResponse enum iter = fst <$> run_ (enum $$ iter) ---------------------------------------------------------------- @@ -29,16 +34,15 @@ decodeResponse = do ---------------------------------------------------------------- decodeFlags :: SGet DNSFlags -decodeFlags = do - flgs <- get16 - return $ DNSFlags (getQorR flgs) - (getOpcode flgs) - (getAuthAnswer flgs) - (getTrunCation flgs) - (getRecDesired flgs) - (getRecAvailable flgs) - (getRcode flgs) +decodeFlags = toFlags <$> get16 where + toFlags flgs = DNSFlags (getQorR flgs) + (getOpcode flgs) + (getAuthAnswer flgs) + (getTrunCation flgs) + (getRecDesired flgs) + (getRecAvailable flgs) + (getRcode flgs) getQorR w = if testBit w 15 then QR_Response else QR_Query getOpcode w = toEnum $ fromIntegral $ shiftR w 11 .&. 0x0f getAuthAnswer w = testBit w 10 |