Skip to content

Commit 9414be2

Browse files
committed
feat: add request timeout (env var)
1 parent 3bf0eb7 commit 9414be2

2 files changed

Lines changed: 19 additions & 13 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ The service exposes clean JSON APIs suitable for automation, monitoring, and sec
2929

3030
CORS "*" is enabled by default. You can disable it by setting `DISABLE_CORS=true` environment variable.
3131

32+
## Requests timeout
33+
34+
DNS/HTTP Query timeout can be controlled by setting `REQUEST_TIMEOUT=XXX` environment variable.
35+
3236
## **Running in Docker**
3337

3438
Pull latest image:

main.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
app = FastAPI(title="Network Utilities Service")
2121

22+
request_timeout = int(os.getenv("REQUEST_TIMEOUT", "25"))
23+
2224
if not os.getenv("DISABLE_CORS"):
2325
app.add_middleware(
2426
CORSMiddleware,
@@ -72,7 +74,7 @@ def get_certificate(hostname: str, port: int = 443) -> CertificateCheckResult:
7274
ctx.verify_mode = ssl.CERT_REQUIRED
7375

7476
try:
75-
with socket.create_connection((hostname, port), timeout=10) as sock:
77+
with socket.create_connection((hostname, port), timeout=request_timeout) as sock:
7678
with ctx.wrap_socket(sock, server_hostname=hostname) as ssock:
7779
cert = ssock.getpeercert()
7880

@@ -126,7 +128,7 @@ def check_hsts(url: str) -> HSTSCheckResult:
126128
url = "https://" + url
127129

128130
try:
129-
with httpx.Client(timeout=10, follow_redirects=True) as client:
131+
with httpx.Client(timeout=request_timeout, follow_redirects=True) as client:
130132
resp = client.get(url)
131133
hsts = resp.headers.get("Strict-Transport-Security")
132134
if not hsts:
@@ -180,7 +182,7 @@ def check_http_to_https_redirect(domain: str) -> RedirectCheckResult:
180182

181183
try:
182184
redirect_chain = []
183-
with httpx.Client(follow_redirects=True, max_redirects=25, timeout=10) as client:
185+
with httpx.Client(follow_redirects=True, max_redirects=25, timeout=request_timeout) as client:
184186
resp = client.get(http_url)
185187
for r in resp.history:
186188
redirect_chain.append(
@@ -271,8 +273,8 @@ class WhoisResult(BaseModel):
271273
def dns_query(domain: str, record_type: str = "A", resolver_ip: str | None = None) -> DNSQueryResult:
272274
try:
273275
resolver = dns.resolver.Resolver()
274-
resolver.timeout = 5
275-
resolver.lifetime = 5
276+
resolver.timeout = request_timeout
277+
resolver.lifetime = request_timeout
276278
if resolver_ip:
277279
resolver.nameservers = [resolver_ip]
278280

@@ -377,8 +379,8 @@ def dnssec_validate(domain: str, resolver_ip: str | None = None) -> DNSSECResult
377379

378380
try:
379381
resolver = dns.resolver.Resolver()
380-
resolver.timeout = 5
381-
resolver.lifetime = 5
382+
resolver.timeout = request_timeout
383+
resolver.lifetime = request_timeout
382384
if resolver_ip:
383385
resolver.nameservers = [resolver_ip]
384386

@@ -394,7 +396,7 @@ def dnssec_validate(domain: str, resolver_ip: str | None = None) -> DNSSECResult
394396
domain, dns.rdatatype.DNSKEY, want_dnssec=True)
395397

396398
# set a longer timeout (in seconds)
397-
timeout = 20
399+
timeout = 30
398400

399401
# try DNSSEC validation with retries
400402
for i in range(3):
@@ -448,8 +450,8 @@ def reverse_dns(ip: str, resolver_ip: str | None = None) -> ReverseDNSResult:
448450
try:
449451
rev = dns.reversename.from_address(ip)
450452
resolver = dns.resolver.Resolver()
451-
resolver.timeout = 5
452-
resolver.lifetime = 5
453+
resolver.timeout = request_timeout
454+
resolver.lifetime = request_timeout
453455
if resolver_ip:
454456
resolver.nameservers = [resolver_ip]
455457

@@ -470,8 +472,8 @@ def reverse_dns(ip: str, resolver_ip: str | None = None) -> ReverseDNSResult:
470472
def soa_axfr_test(domain: str, resolver_ip: str | None = None) -> AXFRResult:
471473
try:
472474
resolver = dns.resolver.Resolver()
473-
resolver.timeout = 5
474-
resolver.lifetime = 5
475+
resolver.timeout = request_timeout
476+
resolver.lifetime = request_timeout
475477
if resolver_ip:
476478
resolver.nameservers = [resolver_ip]
477479

@@ -480,7 +482,7 @@ def soa_axfr_test(domain: str, resolver_ip: str | None = None) -> AXFRResult:
480482

481483
# Try AXFR
482484
nameserver = [r.to_text() for r in resolver.resolve(domain, "NS")][0]
483-
zone = dns.zone.from_xfr(dns.query.xfr(nameserver, domain, timeout=5))
485+
zone = dns.zone.from_xfr(dns.query.xfr(nameserver, domain, timeout=request_timeout))
484486

485487
records = []
486488
for name, node in zone.nodes.items():

0 commit comments

Comments
 (0)