diff --git a/api.rkt b/api.rkt index addec05..fb4fdc1 100644 --- a/api.rkt +++ b/api.rkt @@ -195,21 +195,24 @@ (set-union u1 u2) (set-union d1 d2))) -;; DomainName CompleteAnswer -> ListOf +;; DomainName Maybe -> SetOf (define (extract-addresses name ans) - (match-define (complete-answer ns us ds) ans) - (define rrs (set->list (set-union ns us ds))) - (let loop ((names (list name)) - (ips (set)) - (seen (set))) - (if (null? names) - ips - (let* ((name (car names)) - (records (filter (lambda (rr) (equal? name (rr-name rr))) rrs))) - (if (set-member? seen name) - (loop (cdr names) ips seen) - (let ((a-records (filter (lambda (rr) (equal? 'a (rr-type rr))) records)) - (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)))))))) + (match ans + [#f ;; name-error/NXDOMAIN, so definitely no addresses. + (set)] + [(complete-answer ns us ds) + (define rrs (set->list (set-union ns us ds))) + (let loop ((names (list name)) + (ips (set)) + (seen (set))) + (if (null? names) + ips + (let* ((name (car names)) + (records (filter (lambda (rr) (equal? name (rr-name rr))) rrs))) + (if (set-member? seen name) + (loop (cdr names) ips seen) + (let ((a-records (filter (lambda (rr) (equal? 'a (rr-type rr))) records)) + (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)))))))]))