| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
Network.DNS.Resolver
Contents
Description
DNS Resolver and generic (lower-level) lookup functions.
- data FileOrNumericHost
- data ResolvConf = ResolvConf {}
- defaultResolvConf :: ResolvConf
- data ResolvSeed
- makeResolvSeed :: ResolvConf -> IO ResolvSeed
- data Resolver = Resolver {}
- withResolver :: ResolvSeed -> (Resolver -> IO a) -> IO a
- withResolvers :: [ResolvSeed] -> ([Resolver] -> IO a) -> IO a
- lookup :: Resolver -> Domain -> TYPE -> IO (Either DNSError [RDATA])
- lookupAuth :: Resolver -> Domain -> TYPE -> IO (Either DNSError [RDATA])
- lookupRaw :: Resolver -> Domain -> TYPE -> IO (Either DNSError DNSFormat)
- lookupRaw' :: Resolver -> Domain -> TYPE -> IO (Either DNSError (DNSMessage (RD ByteString)))
- fromDNSFormat :: DNSFormat -> (DNSFormat -> a) -> Either DNSError a
Documentation
Configuration for resolver
data FileOrNumericHost Source
Union type for FilePath and HostName. Specify FilePath to
   "resolv.conf" or numeric IP address in String form.
Warning: Only numeric IP addresses are valid RCHostNames.
Example (using Google's public DNS cache):
>>>let cache = RCHostName "8.8.8.8"
Constructors
| RCFilePath FilePath | A path for "resolv.conf" | 
| RCHostName HostName | A numeric IP address | 
| RCHostPort HostName PortNumber | A numeric IP address and port number | 
data ResolvConf Source
Type for resolver configuration. The easiest way to construct a
   ResolvConf object is to modify the defaultResolvConf.
Constructors
| ResolvConf | |
| Fields 
 | |
defaultResolvConf :: ResolvConf Source
Return a default ResolvConf:
- resolvInfois- RCFilePath"/etc/resolv.conf".- resolvTimeoutis 3,000,000 micro seconds.
- resolvRetryis 3.
- resolvBufsizeis 512. (obsoleted)
 
Example (use Google's public DNS cache instead of resolv.conf):
>>>let cache = RCHostName "8.8.8.8">>>let rc = defaultResolvConf { resolvInfo = cache }
Intermediate data type for resolver
data ResolvSeed Source
Abstract data type of DNS Resolver seed. When implementing a DNS cache, this should be re-used.
Type and function for resolver
Abstract data type of DNS Resolver When implementing a DNS cache, this MUST NOT be re-used.
withResolver :: ResolvSeed -> (Resolver -> IO a) -> IO a Source
Giving a thread-safe Resolver to the function of the second
   argument. A socket for UDP is opened inside and is surely closed.
withResolvers :: [ResolvSeed] -> ([Resolver] -> IO a) -> IO a Source
Giving thread-safe Resolvers to the function of the second
   argument. Sockets for UDP are opened inside and are surely closed.
Looking up functions
lookup :: Resolver -> Domain -> TYPE -> IO (Either DNSError [RDATA]) Source
Look up resource records for a domain, collecting the results from the ANSWER section of the response.
We repeat an example from Network.DNS.Lookup:
>>>let hostname = Data.ByteString.Char8.pack "www.example.com">>>rs <- makeResolvSeed defaultResolvConf>>>withResolver rs $ \resolver -> lookup resolver hostname ARight [93.184.216.119]
lookupAuth :: Resolver -> Domain -> TYPE -> IO (Either DNSError [RDATA]) Source
Look up resource records for a domain, collecting the results from the AUTHORITY section of the response.
Raw looking up function
lookupRaw :: Resolver -> Domain -> TYPE -> IO (Either DNSError DNSFormat) Source
Look up a name and return the entire DNS Response. Sample output is included below, however it is not tested -- the sequence number is unpredictable (it has to be!).
The example code:
let hostname = Data.ByteString.Char8.pack "www.example.com" rs <- makeResolvSeed defaultResolvConf withResolver rs $ resolver -> lookupRaw resolver hostname A
And the (formatted) expected output:
  Right (DNSFormat
          { header = DNSHeader
                       { identifier = 1,
                         flags = DNSFlags
                                   { qOrR = QR_Response,
                                     opcode = OP_STD,
                                     authAnswer = False,
                                     trunCation = False,
                                     recDesired = True,
                                     recAvailable = True,
                                     rcode = NoErr },
                         qdCount = 1,
                         anCount = 1,
                         nsCount = 0,
                         arCount = 0},
            question = [Question { qname = "www.example.com.",
                                   qtype = A}],
            answer = [ResourceRecord {rrname = "www.example.com.",
                                      rrtype = A,
                                      rrttl = 800,
                                      rdlen = 4,
                                      rdata = 93.184.216.119}],
            authority = [],
            additional = []})
 lookupRaw' :: Resolver -> Domain -> TYPE -> IO (Either DNSError (DNSMessage (RD ByteString))) Source