Safe Haskell | None |
---|---|
Language | Haskell2010 |
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 RCHostName
s.
Example (using Google's public DNS cache):
>>>
let cache = RCHostName "8.8.8.8"
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
.
ResolvConf | |
|
defaultResolvConf :: ResolvConf Source
Return a default ResolvConf
:
resolvInfo
isRCFilePath
"/etc/resolv.conf".resolvTimeout
is 3,000,000 micro seconds.resolvRetry
is 3.resolvBufsize
is 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 Resolver
s 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 A
Right [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