summaryrefslogtreecommitdiff
path: root/DomainDig/ReverseDNSService.swift
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDig/ReverseDNSService.swift')
-rw-r--r--DomainDig/ReverseDNSService.swift49
1 files changed, 14 insertions, 35 deletions
diff --git a/DomainDig/ReverseDNSService.swift b/DomainDig/ReverseDNSService.swift
index caab0f7..3b212a8 100644
--- a/DomainDig/ReverseDNSService.swift
+++ b/DomainDig/ReverseDNSService.swift
@@ -1,48 +1,27 @@
import Foundation
struct ReverseDNSService {
- /// Look up the PTR record for an IPv4 address via Cloudflare DoH.
- static func lookup(ip: String) async -> String? {
+ static func lookup(ip: String, resolverURLString: String) async -> ServiceResult<String> {
let octets = ip.split(separator: ".")
- guard octets.count == 4 else { return nil }
+ guard octets.count == 4 else {
+ return .error("Invalid IPv4 address")
+ }
let reversed = octets.reversed().joined(separator: ".")
let ptrDomain = "\(reversed).in-addr.arpa"
- // PTR record type = 12
do {
- let records = try await lookupPTR(domain: ptrDomain)
- return records.first
+ let records = try await DNSLookupService.lookup(
+ domain: ptrDomain,
+ recordType: .PTR,
+ resolverURLString: resolverURLString
+ )
+ if let record = records.first?.value {
+ return .success(record)
+ }
+ return .empty("No PTR record found")
} catch {
- return nil
+ return .error(error.localizedDescription)
}
}
-
- private static func lookupPTR(domain: String) async throws -> [String] {
- var components = URLComponents(string: "https://cloudflare-dns.com/dns-query")!
- components.queryItems = [
- URLQueryItem(name: "name", value: domain),
- URLQueryItem(name: "type", value: "12") // PTR
- ]
-
- var request = URLRequest(url: components.url!)
- request.setValue("application/dns-json", forHTTPHeaderField: "Accept")
-
- let (data, response) = try await URLSession.shared.data(for: request)
-
- guard let httpResponse = response as? HTTPURLResponse,
- httpResponse.statusCode == 200 else {
- throw URLError(.badServerResponse)
- }
-
- let dnsResponse = try JSONDecoder().decode(CloudflareDNSResponse.self, from: data)
-
- guard let answers = dnsResponse.Answer else {
- return []
- }
-
- return answers
- .filter { $0.type == 12 }
- .map { $0.data.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) }
- }
}