module Resolve.DNS.Truncation where

import Resolve.Types
import Resolve.DNS.Types
import qualified Resolve.DNS.Channel as C
import qualified Resolve.DNS.UDP as UDP
import qualified Resolve.DNS.LiveTCP as TCP

import Control.Monad.Trans.Except
import Control.Monad.Trans.Class
import Control.Exception

import System.Log.Logger

nameM = "Resolve.DNS.Truncation"


data Config = Config { udp :: Resolve Message Message
                     , tcp :: Resolve Message Message
                     }

truncation :: Config -> Resolve Message Message
truncation c a = do
  let nameF = nameM
  b <- try (udp c a)
  res <- case b of
    Left UDP.QueryTooLong -> do 
        debugM nameF "query too long"
        return Nothing
    Right b -> if tc $ header $ b then do
      debugM nameF "response truncated"
      return Nothing
      else 
      return $ Just b
  case res of
    Nothing -> do
      debugM nameF "using TCP"
      tcp c a
    Just b -> return b