summaryrefslogtreecommitdiffhomepage
path: root/Network/DNS/Query.hs
diff options
context:
space:
mode:
authorGravatar huangyi <yi.codeplayer@gmail.com>2011-10-23 22:03:27 +0800
committerGravatar huangyi <yi.codeplayer@gmail.com>2011-10-23 22:03:27 +0800
commit89d6ab583274e7e10a69bc915b0e48cfdbc6207a (patch)
treec368ba3b3664fbfe9b2be45353d07e1e0960adea /Network/DNS/Query.hs
parentf16d70af84c736b986153727e2bbcb11ec5da7bd (diff)
add domain compress
Diffstat (limited to 'Network/DNS/Query.hs')
-rw-r--r--Network/DNS/Query.hs32
1 files changed, 20 insertions, 12 deletions
diff --git a/Network/DNS/Query.hs b/Network/DNS/Query.hs
index 0d164b4..3ebd5e0 100644
--- a/Network/DNS/Query.hs
+++ b/Network/DNS/Query.hs
@@ -2,9 +2,7 @@
module Network.DNS.Query (composeQuery, composeDNSFormat) where
import qualified Data.ByteString.Lazy.Char8 as BL (ByteString)
-import qualified Data.ByteString as BS (unpack)
-import qualified Data.ByteString.Char8 as BS (length, split, null)
-import Blaze.ByteString.Builder.ByteString (writeByteString)
+import qualified Data.ByteString.Char8 as BS (length, null, break, drop)
import Network.DNS.StateBinary
import Network.DNS.Internal
import Data.Monoid
@@ -109,7 +107,7 @@ encodeRDATA rd = case rd of
(RD_CNAME dom) -> encodeDomain dom
(RD_PTR dom) -> encodeDomain dom
(RD_MX prf dom) -> mconcat [putInt16 prf, encodeDomain dom]
- (RD_TXT txt) -> writeByteString txt
+ (RD_TXT txt) -> putByteString txt
(RD_OTH bytes) -> mconcat $ map putInt8 bytes
(RD_SOA d1 d2 serial refresh retry expire min') -> mconcat $
[ encodeDomain d1
@@ -130,13 +128,23 @@ encodeRDATA rd = case rd of
----------------------------------------------------------------
encodeDomain :: Domain -> SPut
-encodeDomain dom = foldr ((+++) . encodeSubDomain) (put8 0) $ zip ls ss
+encodeDomain dom | BS.null dom = put8 0
+encodeDomain dom = do
+ mpos <- wsPop dom
+ cur <- gets wsPosition
+ case mpos of
+ Just pos -> encodePointer pos
+ Nothing -> wsPush dom cur >>
+ mconcat [ encodePartialDomain hd
+ , encodeDomain tl
+ ]
where
- ss = filter (not . BS.null) $ BS.split '.' dom
- ls = map BS.length ss
+ (hd, tl') = BS.break (=='.') dom
+ tl = if BS.null tl' then tl' else BS.drop 1 tl'
-encodeSubDomain :: (Int, Domain) -> SPut
-encodeSubDomain (len,sub) = putInt8 len
- +++ foldr ((+++) . put8) mempty ss
- where
- ss = BS.unpack sub
+encodePointer :: Int -> SPut
+encodePointer pos = let w = (pos .|. 0xc000) in putInt16 w
+
+encodePartialDomain :: Domain -> SPut
+encodePartialDomain sub = putInt8 (BS.length sub)
+ +++ putByteString sub