Add contracts to net/dns functions.

This commit is contained in:
Asumu Takikawa 2013-03-01 00:05:40 -05:00
parent 3d0af847b6
commit 9d08d69d07

View File

@ -1,12 +1,53 @@
#lang racket/base #lang racket/base
(require racket/udp ;; DNS query library for Racket
(require racket/contract
racket/udp
racket/system) racket/system)
(provide dns-get-address (provide (contract-out
dns-get-name [dns-get-address
dns-get-mail-exchanger (-> ip-address-string? string? ip-address-string?)]
dns-find-nameserver) [dns-get-name
(-> ip-address-string? ip-address-string? string?)]
[dns-get-mail-exchanger
(-> ip-address-string? ip-address-string? string?)]
[dns-find-nameserver
(-> (or/c ip-address-string? #f))]))
(module+ test (require rackunit))
;; Contract utilities
;; String -> Boolean
;; check if the input string represents an IPv4 address
;; TODO: IPv6, alternative address formats
(define (ip-address-string? val)
;; String -> Boolean
;; check if the given string has leading zeroes
(define (has-leading-zeroes? str)
(and (> (string-length str) 1)
(char=? (string-ref str 0) #\0)))
(and (string? val)
(let ([matches
(regexp-match #px"^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$"
val)])
(and matches
(= (length matches) 5)
(not (ormap has-leading-zeroes? matches))))))
(module+ test
(check-true (ip-address-string? "8.8.8.8"))
(check-true (ip-address-string? "80.8.800.8"))
(check-true (ip-address-string? "80.8.800.0"))
(check-false (ip-address-string? "080.8.800.8"))
(check-false (ip-address-string? "vas8.8.800.8"))
(check-false (ip-address-string? "80.8.128.8dd"))
(check-false (ip-address-string? "0.8.800.008"))
(check-false (ip-address-string? "0.8.800.a8"))
(check-false (ip-address-string? "potatoes"))
(check-false (ip-address-string? "127.0.0")))
;; UDP retry timeout: ;; UDP retry timeout:
(define INIT-TIMEOUT 50) (define INIT-TIMEOUT 50)