Skip to content

Commit

Permalink
Handle zone transfer timeouts gracefully, fixes #23
Browse files Browse the repository at this point in the history
  • Loading branch information
mschwager committed May 1, 2017
1 parent 9334f0f commit 6587eae
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
2 changes: 1 addition & 1 deletion fierce.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def recursive_query(resolver, domain, record_type='NS'):
def zone_transfer(address, domain):
try:
return dns.zone.from_xfr(dns.query.xfr(address, domain))
except (ConnectionError, dns.exception.FormError, EOFError):
except (ConnectionError, EOFError, TimeoutError, dns.exception.FormError):
return None


Expand Down
36 changes: 36 additions & 0 deletions tests/test_fierce.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,42 @@ def test_query_timeout(self):

self.assertIs(result, None)

def test_zone_transfer_connection_error(self):
address = 'test'
domain = dns.name.from_text('example.com.')

with unittest.mock.patch.object(fierce.dns.zone, 'from_xfr', side_effect=ConnectionError()):
result = fierce.zone_transfer(address, domain)

self.assertIs(result, None)

def test_zone_transfer_eof_error(self):
address = 'test'
domain = dns.name.from_text('example.com.')

with unittest.mock.patch.object(fierce.dns.zone, 'from_xfr', side_effect=EOFError()):
result = fierce.zone_transfer(address, domain)

self.assertIs(result, None)

def test_zone_transfer_timeout_error(self):
address = 'test'
domain = dns.name.from_text('example.com.')

with unittest.mock.patch.object(fierce.dns.zone, 'from_xfr', side_effect=TimeoutError()):
result = fierce.zone_transfer(address, domain)

self.assertIs(result, None)

def test_zone_transfer_form_error(self):
address = 'test'
domain = dns.name.from_text('example.com.')

with unittest.mock.patch.object(fierce.dns.zone, 'from_xfr', side_effect=dns.exception.FormError()):
result = fierce.zone_transfer(address, domain)

self.assertIs(result, None)


if __name__ == "__main__":
unittest.main()

0 comments on commit 6587eae

Please sign in to comment.