374 | 374 |
def handle(self, response_wire, response, response_time):
|
375 | 375 |
timeouts = self._get_num_timeouts(response)
|
376 | 376 |
if not self._params['tcp'] and timeouts >= self._timeouts and self._request.payload > self._reduced_payload:
|
377 | |
self._request.payload = self._reduced_payload
|
|
377 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
378 |
self._reduced_payload, options=self._request.options)
|
378 | 379 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_TIMEOUT, None, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, self._reduced_payload)
|
379 | 380 |
|
380 | 381 |
class ClearEDNSFlagOnTimeoutHandler(DNSResponseHandler):
|
|
411 | 412 |
|
412 | 413 |
def handle(self, response_wire, response, response_time):
|
413 | 414 |
timeouts = self._get_num_timeouts(response)
|
414 | |
try:
|
|
415 |
if not self._params['tcp'] and timeouts >= self._timeouts and self._request.options:
|
415 | 416 |
opt = self._request.options[0]
|
416 | |
except IndexError:
|
417 | |
opt = None
|
418 | |
if not self._params['tcp'] and timeouts >= self._timeouts and opt is not None:
|
419 | |
self._request.options.remove(opt)
|
|
417 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
418 |
self._request.payload, options=self._request.options[1:])
|
420 | 419 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_TIMEOUT, None, RETRY_ACTION_REMOVE_EDNS_OPTION, opt.otype)
|
421 | 420 |
|
422 | 421 |
class DisableEDNSOnTimeoutHandler(DNSResponseHandler):
|
|
463 | 462 |
self._rcode = rcode
|
464 | 463 |
|
465 | 464 |
def handle(self, response_wire, response, response_time):
|
466 | |
try:
|
|
465 |
if isinstance(response, dns.message.Message) and response.rcode() == self._rcode and self._request.options:
|
467 | 466 |
opt = self._request.options[0]
|
468 | |
except IndexError:
|
469 | |
opt = None
|
470 | |
if isinstance(response, dns.message.Message) and response.rcode() == self._rcode and opt is not None:
|
471 | |
self._request.options.remove(opt)
|
|
467 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
468 |
self._request.payload, options=self._request.options[1:])
|
472 | 469 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_RCODE, response.rcode(), RETRY_ACTION_REMOVE_EDNS_OPTION, opt.otype)
|
473 | 470 |
|
474 | 471 |
class AddServerCookieOnBADCOOKIE(DNSResponseHandler):
|
|
607 | 604 |
if timeouts >= self._initial_timeouts:
|
608 | 605 |
self._lower_bound = self._reduced_payload
|
609 | 606 |
self._upper_bound = self._request.payload - 1
|
610 | |
self._request.payload = self._reduced_payload
|
|
607 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
608 |
self._reduced_payload, options=self._request.options)
|
611 | 609 |
self._state = self.REDUCED_PAYLOAD
|
612 | 610 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_TIMEOUT, None, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, self._reduced_payload)
|
613 | 611 |
|
|
632 | 630 |
#XXX this is cheating because we're not reporting the change to UDP
|
633 | 631 |
self._params['tcp'] = False
|
634 | 632 |
payload = response_len - 1
|
635 | |
self._request.payload = payload
|
|
633 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
634 |
payload, options=self._request.options)
|
636 | 635 |
self._state = self.TCP_MINUS_ONE
|
637 | 636 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_DIAGNOSTIC, response_len, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, payload)
|
638 | 637 |
|
|
640 | 639 |
if is_timeout:
|
641 | 640 |
self._upper_bound = self._request.payload - 1
|
642 | 641 |
payload = self._lower_bound + (self._upper_bound + 1 - self._lower_bound)//2
|
643 | |
self._request.payload = payload
|
|
642 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
643 |
payload, options=self._request.options)
|
644 | 644 |
self._state = self.PICKLE
|
645 | 645 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_TIMEOUT, None, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, payload)
|
646 | 646 |
# if the size of the message is less than the watermark, then perhaps we were rate limited
|
|
674 | 674 |
elif is_timeout:
|
675 | 675 |
self._upper_bound = self._request.payload - 1
|
676 | 676 |
payload = self._lower_bound + (self._upper_bound + 1 - self._lower_bound)//2
|
677 | |
self._request.payload = payload
|
|
677 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
678 |
payload, options=self._request.options)
|
678 | 679 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_TIMEOUT, None, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, payload)
|
679 | 680 |
# if the size of the message is less than the watermark, then perhaps we were rate limited
|
680 | 681 |
elif response_len < self._water_mark:
|
|
690 | 691 |
elif is_valid:
|
691 | 692 |
self._lower_bound = self._request.payload
|
692 | 693 |
payload = self._lower_bound + (self._upper_bound + 1 - self._lower_bound)//2
|
693 | |
self._request.payload = payload
|
|
694 |
self._request.use_edns(self._request.edns, self._request.ednsflags,
|
|
695 |
payload, options=self._request.options)
|
694 | 696 |
return DNSQueryRetryAttempt(response_time, RETRY_CAUSE_DIAGNOSTIC, response_len, RETRY_ACTION_CHANGE_UDP_MAX_PAYLOAD, payload)
|
695 | 697 |
|
696 | 698 |
elif self._state == self.TCP_FINAL:
|