@@ -83,9 +83,9 @@ class DNSQueryTool:
8383 STD_TIMEOUT : float = 5.0
8484 STD_FOLLOW_NAMESERVER_ORDER : bool = True
8585 STD_TRUST_SERVER : bool = False
86+ STD_DELAY : float = 0.0
8687
8788 SUPPORTED_PROTOCOL : List [str ] = ["TCP" , "UDP" , "HTTPS" , "TLS" ]
88- BREAKOFF : float = 0.2
8989
9090 value2rdata_type : Dict [int , str ] = {
9191 x .value : x .name for x in dns .rdatatype .RdataType
@@ -102,6 +102,7 @@ class DNSQueryTool:
102102 _preferred_protocol : str = "UDP"
103103 _query_timeout : float = 5.0
104104 _trust_server : bool = False
105+ _delay : float = 0.0
105106
106107 dns_name : Optional [str ] = None
107108
@@ -115,6 +116,7 @@ def __init__(
115116 follow_nameserver_order : Optional [bool ] = None ,
116117 preferred_protocol : Optional [str ] = None ,
117118 trust_server : Optional [bool ] = None ,
119+ delay : Optional [bool ] = None ,
118120 ) -> None :
119121 if nameservers is not None :
120122 self .nameservers .set_nameservers (nameservers )
@@ -136,6 +138,11 @@ def __init__(
136138 else :
137139 self .guess_and_set_trust_server ()
138140
141+ if delay is not None :
142+ self .delay = delay
143+ else :
144+ self .guess_and_set_delay ()
145+
139146 def prepare_query (func ): # pylint: disable=no-self-argument
140147 """
141148 Prepare the query after running the decorated method.
@@ -562,6 +569,50 @@ def set_preferred_protocol(self, value: str) -> "DNSQueryTool":
562569
563570 return self
564571
572+ @property
573+ def delay (self ) -> float :
574+ """
575+ Provides the current state of the :code:`_delay` attribute.
576+ """
577+
578+ return self ._delay
579+
580+ @delay .setter
581+ @update_lookup_record
582+ def delay (self , value : Union [int , float ]) -> None :
583+ """
584+ Sets the delay to apply.
585+
586+ :param value:
587+ The delay to apply.
588+
589+ :raise TypeError:
590+ When the given :code:`value` is not a :py:class:`float`
591+ nor :py:class.`int`.
592+ :raise ValueError:
593+ When the given :code:`value` is not a positive.
594+ """
595+
596+ if not isinstance (value , (float , int )):
597+ raise TypeError (f"<value> should be { float } or { int } , { type (value )} given." )
598+
599+ if value < 0 :
600+ raise ValueError (f"<value> should be positive, { value } given." )
601+
602+ self ._delay = float (value )
603+
604+ def set_delay (self , value : Union [int , float ]) -> "DNSQueryTool" :
605+ """
606+ Sets the delay to apply.
607+
608+ :param value:
609+ The delay to apply.
610+ """
611+
612+ self .delay = value
613+
614+ return self
615+
565616 def guess_and_set_preferred_protocol (self ) -> "DNSQueryTool" :
566617 """
567618 Try to guess and set the preferred procol.
@@ -612,6 +663,19 @@ def guess_and_set_trust_server(self) -> "DNSQueryTool":
612663
613664 return self
614665
666+ def guess_and_set_delay (self ) -> "DNSQueryTool" :
667+ """
668+ Try to guess and set the delay to apply.
669+ """
670+
671+ if PyFunceble .facility .ConfigLoader .is_already_loaded ():
672+ if PyFunceble .storage .CONFIGURATION .dns .delay :
673+ self .delay = PyFunceble .storage .CONFIGURATION .dns .delay
674+ else :
675+ self .delay = self .STD_DELAY
676+ else :
677+ self .delay = self .STD_DELAY
678+
615679 def guess_all_settings (
616680 self ,
617681 ) -> "DNSQueryTool" : # pragma: no cover ## Method themselves are more important
@@ -750,10 +814,10 @@ def tcp(
750814 "Unsuccessfully queried information of %r from %r. Sleeping %fs." ,
751815 self .subject ,
752816 nameserver ,
753- self .BREAKOFF ,
817+ self .delay ,
754818 )
755819
756- time .sleep (self .BREAKOFF )
820+ time .sleep (self .delay )
757821
758822 return ListHelper (result ).remove_duplicates ().subject
759823
@@ -822,10 +886,10 @@ def udp(
822886 "Unsuccessfully queried information of %r from %r. Sleeping %fs." ,
823887 self .subject ,
824888 nameserver ,
825- self .BREAKOFF ,
889+ self .delay ,
826890 )
827891
828- time .sleep (self .BREAKOFF )
892+ time .sleep (self .delay )
829893
830894 return ListHelper (result ).remove_duplicates ().subject
831895
@@ -888,10 +952,10 @@ def https(
888952 "Unsuccessfully queried information of %r from %r. Sleeping %fs." ,
889953 self .subject ,
890954 nameserver ,
891- self .BREAKOFF ,
955+ self .delay ,
892956 )
893957
894- time .sleep (self .BREAKOFF )
958+ time .sleep (self .delay )
895959
896960 return ListHelper (result ).remove_duplicates ().subject
897961
@@ -965,10 +1029,10 @@ def tls(
9651029 "Unsuccessfully queried information of %r from %r. Sleeping %fs." ,
9661030 self .subject ,
9671031 nameserver ,
968- self .BREAKOFF ,
1032+ self .delay ,
9691033 )
9701034
971- time .sleep (self .BREAKOFF )
1035+ time .sleep (self .delay )
9721036
9731037 return ListHelper (result ).remove_duplicates ().subject
9741038
0 commit comments