diff options
author | Kazu Yamamoto <kazu@iij.ad.jp> | 2011-10-24 15:57:04 +0900 |
---|---|---|
committer | Kazu Yamamoto <kazu@iij.ad.jp> | 2011-10-24 15:57:04 +0900 |
commit | ee8d2b9c69dd7dd4d47e5d88f47150770a15129a (patch) | |
tree | 6b2eed3e41ffadafa5d47e7411a4b1a24aa9f1d3 /Network | |
parent | 2b3919681b49d6f31311bfaf4bc3a958a076618d (diff) |
Supporting server side and brushing up.
Diffstat (limited to 'Network')
-rw-r--r-- | Network/DNS.hs | 13 | ||||
-rw-r--r-- | Network/DNS/Decode.hs (renamed from Network/DNS/Response.hs) | 43 | ||||
-rw-r--r-- | Network/DNS/Encode.hs (renamed from Network/DNS/Query.hs) | 20 | ||||
-rw-r--r-- | Network/DNS/Resolver.hs | 24 |
4 files changed, 62 insertions, 38 deletions
diff --git a/Network/DNS.hs b/Network/DNS.hs index acf56c6..73b44db 100644 --- a/Network/DNS.hs +++ b/Network/DNS.hs @@ -1,10 +1,9 @@ {-| Thread-safe DNS library written in Haskell. - Currently, only resolver side is supported. This code is written in - Haskell, not using FFI. + This code is written in Haskell, not using FFI. - Sample code: + Sample code for DNS lookup: @ import qualified Network.DNS as DNS (lookup) @@ -18,11 +17,19 @@ -} module Network.DNS ( + -- * High level module Network.DNS.Lookup , module Network.DNS.Resolver , module Network.DNS.Types + -- * Low level + , module Network.DNS.Decode + , module Network.DNS.Encode ) where import Network.DNS.Lookup import Network.DNS.Resolver import Network.DNS.Types +import Network.DNS.Decode +import Network.DNS.Encode + + diff --git a/Network/DNS/Response.hs b/Network/DNS/Decode.hs index 523335b..c84a06d 100644 --- a/Network/DNS/Response.hs +++ b/Network/DNS/Decode.hs @@ -1,33 +1,46 @@ {-# LANGUAGE OverloadedStrings #-} -module Network.DNS.Response (responseIter, parseResponse, runDNSFormat, runDNSFormat_) where +module Network.DNS.Decode ( + receive + , decode + ) where import Control.Applicative import Control.Monad import Data.Bits +import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as BS +import qualified Data.ByteString.Lazy as BL +import Data.Enumerator (Enumerator, run_, ($$)) import Data.IP import Data.Maybe +import Network import Network.DNS.Internal import Network.DNS.StateBinary -import Data.Enumerator (Enumerator, Iteratee, run_, ($$)) -import Data.ByteString (ByteString) -import qualified Data.ByteString.Lazy as BL +import Network.Socket.Enumerator -runDNSFormat :: BL.ByteString -> Either String (DNSFormat, PState) -runDNSFormat = runSGet decodeResponse +---------------------------------------------------------------- -runDNSFormat_ :: BL.ByteString -> Either String DNSFormat -runDNSFormat_ bs = fst <$> runDNSFormat bs +{-| Receiving DNS data from 'Socket' and parse it. + The second argument is a buffer size for the socket. +-} +receive :: Socket -> Integer -> IO DNSFormat +receive sock bufsize = receiveDNSFormat responseEnum + where + responseEnum = enumSocket bufsize sock + +{-| Parsing DNS data. +-} +decode :: BL.ByteString -> Either String DNSFormat +decode bs = fst <$> runSGet decodeResponse bs -responseIter :: Monad m => Iteratee ByteString m (DNSFormat, PState) -responseIter = iterSGet decodeResponse +---------------------------------------------------------------- -parseResponse :: (Functor m, Monad m) - => Enumerator ByteString m (a,b) - -> Iteratee ByteString m (a,b) - -> m a -parseResponse enum iter = fst <$> run_ (enum $$ iter) +receiveDNSFormat :: Enumerator ByteString IO (DNSFormat, PState) + -> IO DNSFormat +receiveDNSFormat enum = fst <$> run_ (enum $$ iter) + where + iter = iterSGet decodeResponse ---------------------------------------------------------------- diff --git a/Network/DNS/Query.hs b/Network/DNS/Encode.hs index bdf86bc..6116a04 100644 --- a/Network/DNS/Query.hs +++ b/Network/DNS/Encode.hs @@ -1,5 +1,5 @@ {-# LANGUAGE RecordWildCards #-} -module Network.DNS.Query (composeQuery, composeDNSFormat) where +module Network.DNS.Encode (encode) where import qualified Data.ByteString.Lazy.Char8 as BL (ByteString) import qualified Data.ByteString.Char8 as BS (length, null, break, drop) @@ -16,20 +16,10 @@ import Data.IP ---------------------------------------------------------------- -composeDNSFormat :: DNSFormat -> BL.ByteString -composeDNSFormat fmt = runSPut (encodeDNSFormat fmt) - -composeQuery :: Int -> [Question] -> BL.ByteString -composeQuery idt qs = composeDNSFormat qry - where - hdr = header defaultQuery - qry = defaultQuery { - header = hdr { - identifier = idt - , qdCount = length qs - } - , question = qs - } +{-| Composing DNS data. +-} +encode :: DNSFormat -> BL.ByteString +encode fmt = runSPut (encodeDNSFormat fmt) ---------------------------------------------------------------- diff --git a/Network/DNS/Resolver.hs b/Network/DNS/Resolver.hs index b3182f6..44aee7d 100644 --- a/Network/DNS/Resolver.hs +++ b/Network/DNS/Resolver.hs @@ -28,19 +28,20 @@ module Network.DNS.Resolver ( import Control.Applicative import Control.Exception +import qualified Data.ByteString.Lazy as BL import Data.Char import Data.Int import Data.List hiding (find, lookup) import Network.BSD -import Network.DNS.Query -import Network.DNS.Response +import Network.DNS.Decode +import Network.DNS.Encode +import Network.DNS.Internal import Network.DNS.Types import Network.Socket hiding (send, sendTo, recv, recvFrom) import Network.Socket.ByteString.Lazy import Prelude hiding (lookup) import System.Random import System.Timeout -import Network.Socket.Enumerator ---------------------------------------------------------------- @@ -170,8 +171,7 @@ lookupRaw :: Resolver -> Domain -> TYPE -> IO (Maybe DNSFormat) lookupRaw rlv dom typ = do seqno <- genId rlv sendAll sock (composeQuery seqno [q]) - let responseEnum = enumSocket bufsize sock - (>>= check seqno) <$> timeout tm (parseResponse responseEnum responseIter) + (>>= check seqno) <$> timeout tm (receive sock bufsize) where sock = dnsSock rlv bufsize = dnsBufsize rlv @@ -182,3 +182,17 @@ lookupRaw rlv dom typ = do if identifier hdr == seqno && anCount hdr /= 0 then Just res else Nothing + +---------------------------------------------------------------- + +composeQuery :: Int -> [Question] -> BL.ByteString +composeQuery idt qs = encode qry + where + hdr = header defaultQuery + qry = defaultQuery { + header = hdr { + identifier = idt + , qdCount = length qs + } + , question = qs + } |