Handle name-error/NXDOMAIN when looking up nameservers

This commit is contained in:
Tony Garnock-Jones 2012-02-17 21:32:56 -05:00
parent bee10f5cdd
commit b991160eab
1 changed files with 20 additions and 17 deletions

37
api.rkt
View File

@ -195,21 +195,24 @@
(set-union u1 u2) (set-union u1 u2)
(set-union d1 d2))) (set-union d1 d2)))
;; DomainName CompleteAnswer -> ListOf<IPv4> ;; DomainName Maybe<CompleteAnswer> -> SetOf<IPv4>
(define (extract-addresses name ans) (define (extract-addresses name ans)
(match-define (complete-answer ns us ds) ans) (match ans
(define rrs (set->list (set-union ns us ds))) [#f ;; name-error/NXDOMAIN, so definitely no addresses.
(let loop ((names (list name)) (set)]
(ips (set)) [(complete-answer ns us ds)
(seen (set))) (define rrs (set->list (set-union ns us ds)))
(if (null? names) (let loop ((names (list name))
ips (ips (set))
(let* ((name (car names)) (seen (set)))
(records (filter (lambda (rr) (equal? name (rr-name rr))) rrs))) (if (null? names)
(if (set-member? seen name) ips
(loop (cdr names) ips seen) (let* ((name (car names))
(let ((a-records (filter (lambda (rr) (equal? 'a (rr-type rr))) records)) (records (filter (lambda (rr) (equal? name (rr-name rr))) rrs)))
(cname-records (filter (lambda (rr) (equal? 'cname (rr-type rr))) records))) (if (set-member? seen name)
(loop (append (map rr-rdata cname-records) (cdr names)) (loop (cdr names) ips seen)
(set-union ips (list->set (map rr-rdata a-records))) (let ((a-records (filter (lambda (rr) (equal? 'a (rr-type rr))) records))
(set-add seen name)))))))) (cname-records (filter (lambda (rr) (equal? 'cname (rr-type rr))) records)))
(loop (append (map rr-rdata cname-records) (cdr names))
(set-union ips (list->set (map rr-rdata a-records)))
(set-add seen name)))))))]))