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
|
package method
import (
"edns_svcb/utils"
"fmt"
"log"
"sync"
"github.com/miekg/dns"
)
func HTTPSSupportTest(addr string) TestResult {
_, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.net", RD: true})
if err != nil {
return TestResult{Err: err}
}
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "blog.cloudflare.com", Qtype: dns.TypeHTTPS, RD: true})
if err == nil {
if len(res.Answer) == 1 {
if _, ok := res.Extra[0].(*dns.HTTPS); ok {
return TestResult{Alive: true, Support: true}
}
}
}
return TestResult{Alive: true}
}
func SVCBSupportTest(addr string) TestResult {
_, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "www.example.net", RD: true})
if err != nil {
return TestResult{Err: err}
}
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: "blog.cloudflare.com", Qtype: dns.TypeSVCB, RD: true})
if err == nil {
if len(res.Answer) == 1 {
if _, ok := res.Extra[0].(*dns.SVCB); ok {
return TestResult{Alive: true, Support: true}
}
}
}
return TestResult{Alive: true}
}
func HTTPSRecordMeasurement(servers []string, domain_pool chan string, result_pool chan bool, routine_num int, wg *sync.WaitGroup, logger *log.Logger) {
for i := 0; i < routine_num; i++ {
wg.Add(1)
go HTTPSRecordTestRoutine(servers, domain_pool, result_pool, wg, logger)
}
}
func HTTPSRecordTestRoutine(server_list []string, domain_pool chan string, result_pool chan bool, wg *sync.WaitGroup, logger *log.Logger) {
server_index := 0
for {
if domain, ok := <-domain_pool; ok {
server := server_list[server_index] + ":53"
res, err := HTTPSRecordTest(server, domain)
if err == nil {
logger.Printf("%v : %v", domain, res)
} else {
logger.Printf("%v : failed (%v) server %v", domain, err, server)
}
result_pool <- res
server_index = (server_index + 1) % len(server_list)
} else {
break
}
}
wg.Done()
}
func HTTPSRecordTest(addr, domain string) (bool, error) {
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: domain, Qtype: dns.TypeHTTPS, RD: true})
if err == nil {
if len(res.Answer) > 0 {
if _, ok := res.Answer[0].(*dns.HTTPS); ok {
return true, nil
}
}
}
return false, err
}
func HTTPSRecordResultProcess(result_pool chan bool, wg *sync.WaitGroup) {
total_cnt := 0
valid_cnt := 0
for {
if res, ok := <-result_pool; ok {
total_cnt++
if res {
valid_cnt++
}
} else {
break
}
}
fmt.Printf("Domain HTTPS support Test: total %v https %v\n", total_cnt, valid_cnt)
wg.Done()
}
func SVCBRecordTest(addr, domain string) bool {
res, err := utils.DNSQuery(addr, utils.DNSOptions{Domain: domain, Qtype: dns.TypeSVCB, RD: true})
if err == nil {
if len(res.Answer) > 0 {
if _, ok := res.Answer[0].(*dns.SVCB); ok {
return true
}
}
}
return false
}
|