racket/pkgs/net-lib/net/private/rr-srv.rkt
2016-05-27 17:20:35 -04:00

36 lines
1.1 KiB
Racket

#lang racket/base
;; Parser and representation for SRV RRs.
(require racket/contract)
(provide parse-srv-rr
(contract-out
(struct srv-rr ((priority (integer-in 0 65535))
(weight (integer-in 0 65535))
(port (integer-in 0 65535))
(target string?)))))
(require racket/match)
(require "rr-generic.rkt")
(struct srv-rr (priority
weight
port
target)
#:prefab)
(define (parse-srv-rr answer-records reply)
(let loop ((rrs answer-records))
(match rrs
['() '()]
[(cons rr rest)
(match (rr-data rr)
[(list* prio1 prio2 weight1 weight2 port1 port2 target-bytes)
(define-values (target-name _rest) (parse-name target-bytes reply))
(cons (srv-rr (octet-pair->number prio1 prio2)
(octet-pair->number weight1 weight2)
(octet-pair->number port1 port2)
(bytes->string/latin-1 target-name))
(loop rest))]
[_ (loop rest)])])))