-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathresolver_rsp_doh_json.go
114 lines (100 loc) · 2.83 KB
/
resolver_rsp_doh_json.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package main
import (
"github.com/miekg/dns"
"math"
)
type DohJsonResolverQ struct {
Name string `json:"name,omitempty"`
Type uint16 `json:"type,omitempty"`
}
type DohJsonResolverRR struct {
Name string `json:"name,omitempty"`
Type uint16 `json:"type,omitempty"`
TTL uint32 `json:"TTL,omitempty"`
Data string `json:"data,omitempty"`
}
type DohJsonResolverRsp struct {
Status int `json:"Status"`
Truncated bool `json:"TC"`
RecursionDesired bool `json:"RD"`
RecursionAvailable bool `json:"RA"`
AuthenticData bool `json:"AD"`
CheckingDisabled bool `json:"CD"`
Question []DohJsonResolverQ `json:"Question,omitempty"`
Answer []DohJsonResolverRR `json:"Answer,omitempty"`
Authority []DohJsonResolverRR `json:"Authority,omitempty"`
Additional []DohJsonResolverRR `json:"Additional,omitempty"`
EDNSClientSubnet string `json:"edns_client_subnet,omitempty"`
Comment string `json:"Comment,omitempty"`
UnixTSOfArrival_ int64
}
func (rsp *DohJsonResolverRsp) StatusV() int {
return rsp.Status
}
func (rsp *DohJsonResolverRsp) TruncatedV() bool {
return rsp.Truncated
}
func (rsp *DohJsonResolverRsp) RecursionAvailableV() bool {
return rsp.RecursionAvailable
}
func (rsp *DohJsonResolverRsp) AuthenticDataV() bool {
return rsp.AuthenticData
}
func (rsp *DohJsonResolverRsp) AnswerV() (answer []dns.RR) {
for _, r_ := range rsp.Answer {
rr, err := r_.RR()
if err != nil {
log.Warnf("Failed to parse RR: %s", err)
return nil
}
answer = append(answer, rr)
}
return
}
func (rsp *DohJsonResolverRsp) NsV() (ns []dns.RR) {
ns = make([]dns.RR, len(rsp.Authority))
for i_, r_ := range rsp.Authority {
rr, err := r_.RR()
if err != nil {
log.Warnf("Failed to parse RR: %s", err)
return nil
}
ns[i_] = rr
}
return
}
func (rsp *DohJsonResolverRsp) ExtraV() (extra []dns.RR) {
extra = make([]dns.RR, len(rsp.Additional))
for i_, r_ := range rsp.Additional {
rr, err := r_.RR()
if err != nil {
log.Warnf("Failed to parse RR: %s", err)
return nil
}
extra[i_] = rr
}
return
}
func (rsp *DohJsonResolverRsp) UnixTSOfArrival() int64 {
return rsp.UnixTSOfArrival_
}
func (rsp *DohJsonResolverRsp) ObtainMinimalTTL() (ttl uint32) {
var minTTLInAnswer uint32 = math.MaxUint32
for _, r_ := range ConcatSlices(rsp.Answer, rsp.Authority) {
if r_.TTL < minTTLInAnswer {
minTTLInAnswer = r_.TTL
}
}
if minTTLInAnswer == math.MaxUint32 {
ttl = 0
} else {
ttl = minTTLInAnswer
}
return
}
// RR transforms a DohJsonResolverRR to a dns.RR
func (r DohJsonResolverRR) RR() (dns.RR, error) {
hdr := dns.RR_Header{Name: r.Name, Rrtype: r.Type, Class: dns.ClassINET, Ttl: r.TTL}
str := hdr.String() + r.Data
return dns.NewRR(str)
}