diff options
| author | Shulhan <m.shulhan@gmail.com> | 2019-12-04 23:20:10 +0700 |
|---|---|---|
| committer | Shulhan <m.shulhan@gmail.com> | 2019-12-04 23:59:13 +0700 |
| commit | eaf16a54fcb430885578c03e4e246af14966f033 (patch) | |
| tree | e2c37cb8087aae79c20d7bde670df40e31299ad6 | |
| parent | ce5fbf87e42d24ea95cd558150961623b9403c6e (diff) | |
| download | pakakeh.go-eaf16a54fcb430885578c03e4e246af14966f033.tar.xz | |
dns: remove the use of pointer on Message fields
| -rw-r--r-- | lib/dns/answer.go | 4 | ||||
| -rw-r--r-- | lib/dns/answer_test.go | 26 | ||||
| -rw-r--r-- | lib/dns/answers_test.go | 12 | ||||
| -rw-r--r-- | lib/dns/caches.go | 2 | ||||
| -rw-r--r-- | lib/dns/caches_test.go | 20 | ||||
| -rw-r--r-- | lib/dns/dohclient_test.go | 80 | ||||
| -rw-r--r-- | lib/dns/dotclient_test.go | 30 | ||||
| -rw-r--r-- | lib/dns/example_udpclient_test.go | 4 | ||||
| -rw-r--r-- | lib/dns/hosts.go | 6 | ||||
| -rw-r--r-- | lib/dns/masterfile.go | 12 | ||||
| -rw-r--r-- | lib/dns/masterfile_test.go | 114 | ||||
| -rw-r--r-- | lib/dns/message.go | 47 | ||||
| -rw-r--r-- | lib/dns/message_test.go | 164 | ||||
| -rw-r--r-- | lib/dns/resourcerecord.go | 20 | ||||
| -rw-r--r-- | lib/dns/server.go | 32 | ||||
| -rw-r--r-- | lib/dns/tcpclient_test.go | 30 | ||||
| -rw-r--r-- | lib/dns/udpclient_test.go | 40 |
17 files changed, 320 insertions, 323 deletions
diff --git a/lib/dns/answer.go b/lib/dns/answer.go index 493de8ae..68e6a883 100644 --- a/lib/dns/answer.go +++ b/lib/dns/answer.go @@ -41,10 +41,6 @@ type answer struct { // to current timestamp. // func newAnswer(msg *Message, isLocal bool) (an *answer) { - if msg == nil || msg.Question == nil { - return nil - } - an = &answer{ qname: string(msg.Question.Name), qtype: msg.Question.Type, diff --git a/lib/dns/answer_test.go b/lib/dns/answer_test.go index 03e64a9f..5f98ee24 100644 --- a/lib/dns/answer_test.go +++ b/lib/dns/answer_test.go @@ -16,15 +16,15 @@ func TestNewAnswer(t *testing.T) { at := time.Now().Unix() msg1 := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("test"), Type: 1, Class: 1, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("test"), Type: QueryTypeA, Class: QueryClassIN, @@ -46,8 +46,6 @@ func TestNewAnswer(t *testing.T) { expQClass uint16 isLocal bool }{{ - desc: "With nil msg", - }, { desc: "With local message", msg: msg1, isLocal: true, @@ -124,17 +122,17 @@ func TestAnswerClear(t *testing.T) { func TestAnswerGet(t *testing.T) { // kilabit.info A res := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -144,8 +142,8 @@ func TestAnswerGet(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, } _, err := res.Pack() @@ -189,8 +187,8 @@ func TestAnswerGet(t *testing.T) { test.Assert(t, "receivedAt", an.receivedAt >= at-5, true, true) test.Assert(t, "accessedAt", an.accessedAt >= at, true, true) got := &Message{ - Header: &SectionHeader{}, - Question: &SectionQuestion{}, + Header: SectionHeader{}, + Question: SectionQuestion{}, Packet: gotPacket, } err := got.Unpack() @@ -206,12 +204,12 @@ func TestAnswerGet(t *testing.T) { func TestAnswerUpdate(t *testing.T) { at := time.Now().Unix() - 5 msg1 := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, } msg2 := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, } diff --git a/lib/dns/answers_test.go b/lib/dns/answers_test.go index 4990763c..1af9d410 100644 --- a/lib/dns/answers_test.go +++ b/lib/dns/answers_test.go @@ -47,12 +47,12 @@ func TestNewAnswers(t *testing.T) { func TestAnswersGet(t *testing.T) { msg := &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("test"), Type: 1, Class: 1, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("test"), Type: QueryTypeA, Class: QueryClassIN, @@ -98,12 +98,12 @@ func TestAnswersGet(t *testing.T) { func TestAnswersRemove(t *testing.T) { msg := &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("test"), Type: 1, Class: 1, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("test"), Type: QueryTypeA, Class: QueryClassIN, @@ -158,7 +158,7 @@ func TestAnswersUpdate(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, }, @@ -177,7 +177,7 @@ func TestAnswersUpdate(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, }, }, diff --git a/lib/dns/caches.go b/lib/dns/caches.go index 27971fd2..b1ef33b3 100644 --- a/lib/dns/caches.go +++ b/lib/dns/caches.go @@ -123,7 +123,7 @@ func (c *caches) prune() { } if debug.Value >= 1 { - fmt.Printf("dns: - 0:%s\n", an.msg.Question) + fmt.Printf("dns: - 0:%s\n", an.msg.Question.String()) } next := e.Next() diff --git a/lib/dns/caches_test.go b/lib/dns/caches_test.go index d25d235e..2878c8a1 100644 --- a/lib/dns/caches_test.go +++ b/lib/dns/caches_test.go @@ -49,7 +49,7 @@ func TestCachesGet(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, }, @@ -60,7 +60,7 @@ func TestCachesGet(t *testing.T) { qtype: 2, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, }, }, @@ -71,7 +71,7 @@ func TestCachesGet(t *testing.T) { qtype: 3, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 3, }, }, @@ -127,7 +127,7 @@ func TestCachesPrune(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, }, @@ -139,7 +139,7 @@ func TestCachesPrune(t *testing.T) { qtype: 2, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, }, }, @@ -151,7 +151,7 @@ func TestCachesPrune(t *testing.T) { qtype: 3, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 3, }, }, @@ -196,7 +196,7 @@ func TestCachesUpsert(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, }, }, @@ -208,7 +208,7 @@ func TestCachesUpsert(t *testing.T) { qtype: 1, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 3, }, }, @@ -220,7 +220,7 @@ func TestCachesUpsert(t *testing.T) { qtype: 2, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, }, }, @@ -232,7 +232,7 @@ func TestCachesUpsert(t *testing.T) { qtype: 2, qclass: 1, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 4, }, }, diff --git a/lib/dns/dohclient_test.go b/lib/dns/dohclient_test.go index afbe12c8..c59cf1a8 100644 --- a/lib/dns/dohclient_test.go +++ b/lib/dns/dohclient_test.go @@ -31,18 +31,18 @@ func TestDoHClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -52,8 +52,8 @@ func TestDoHClient_Lookup(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", @@ -61,18 +61,18 @@ func TestDoHClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -87,8 +87,8 @@ func TestDoHClient_Lookup(t *testing.T) { Minimum: 3600, }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", @@ -96,18 +96,18 @@ func TestDoHClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -116,8 +116,8 @@ func TestDoHClient_Lookup(t *testing.T) { Value: []byte("This is a test server"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", @@ -125,20 +125,20 @@ func TestDoHClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: false, RCode: RCodeErrServer, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeAAAA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Answer: []ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }} @@ -180,18 +180,18 @@ func TestDoHClient_Post(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -201,8 +201,8 @@ func TestDoHClient_Post(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", @@ -210,18 +210,18 @@ func TestDoHClient_Post(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -236,8 +236,8 @@ func TestDoHClient_Post(t *testing.T) { Minimum: 3600, }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", @@ -245,18 +245,18 @@ func TestDoHClient_Post(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -265,8 +265,8 @@ func TestDoHClient_Post(t *testing.T) { Value: []byte("This is a test server"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", @@ -274,20 +274,20 @@ func TestDoHClient_Post(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0, IsAA: false, RCode: RCodeErrServer, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeAAAA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Answer: []ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }} diff --git a/lib/dns/dotclient_test.go b/lib/dns/dotclient_test.go index 42449daa..d17ff977 100644 --- a/lib/dns/dotclient_test.go +++ b/lib/dns/dotclient_test.go @@ -29,18 +29,18 @@ func TestDoTClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 5, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -50,8 +50,8 @@ func TestDoTClient_Lookup(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", @@ -59,18 +59,18 @@ func TestDoTClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 6, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -85,8 +85,8 @@ func TestDoTClient_Lookup(t *testing.T) { Minimum: 3600, }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", @@ -94,18 +94,18 @@ func TestDoTClient_Lookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 7, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -114,8 +114,8 @@ func TestDoTClient_Lookup(t *testing.T) { Value: []byte("This is a test server"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }} diff --git a/lib/dns/example_udpclient_test.go b/lib/dns/example_udpclient_test.go index f81dcb60..d5d200ca 100644 --- a/lib/dns/example_udpclient_test.go +++ b/lib/dns/example_udpclient_test.go @@ -19,8 +19,8 @@ func ExampleUDPClient() { } req := &dns.Message{ - Header: &dns.SectionHeader{}, - Question: &dns.SectionQuestion{ + Header: dns.SectionHeader{}, + Question: dns.SectionQuestion{ Name: []byte("kilabit.info"), Type: dns.QueryTypeA, Class: dns.QueryClassIN, diff --git a/lib/dns/hosts.go b/lib/dns/hosts.go index 1a39454c..1521a007 100644 --- a/lib/dns/hosts.go +++ b/lib/dns/hosts.go @@ -67,17 +67,17 @@ func newMessage(addr, hname []byte) *Message { copy(rrName, hname) msg := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: hname, Type: qtype, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: rrName, Type: qtype, Class: QueryClassIN, diff --git a/lib/dns/masterfile.go b/lib/dns/masterfile.go index 8b6417cb..cd2e80f5 100644 --- a/lib/dns/masterfile.go +++ b/lib/dns/masterfile.go @@ -1031,21 +1031,21 @@ func (m *master) push(rr *ResourceRecord) bool { if m.msgs[x].Question.Class != rr.Class { continue } - m.msgs[x].Answer = append(m.msgs[x].Answer, rr) + m.msgs[x].Answer = append(m.msgs[x].Answer, *rr) return false } msg := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: rr.Name, Type: rr.Type, Class: rr.Class, }, - Answer: []*ResourceRecord{rr}, + Answer: []ResourceRecord{*rr}, } m.msgs = append(m.msgs, msg) @@ -1087,9 +1087,9 @@ func (m *master) pack() { if debug.Value >= 3 { fmt.Printf("= Header: %+v\n", msg.Header) - fmt.Printf(" Question: %s\n", msg.Question) + fmt.Printf(" Question: %s\n", msg.Question.String()) for x := 0; x < len(msg.Answer); x++ { - fmt.Printf(" Answer: %s\n", msg.Answer[x]) + fmt.Printf(" Answer: %s\n", msg.Answer[x].String()) fmt.Printf(" RData: %s\n", msg.Answer[x].RData()) } } diff --git a/lib/dns/masterfile_test.go b/lib/dns/masterfile_test.go index 141658ed..12ed083e 100644 --- a/lib/dns/masterfile_test.go +++ b/lib/dns/masterfile_test.go @@ -164,17 +164,17 @@ VAXA A 10.2.0.27 `, exp: []*Message{{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("isi.edu"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("isi.edu"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -190,17 +190,17 @@ VAXA A 10.2.0.27 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 3, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("isi.edu"), Type: QueryTypeNS, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("isi.edu"), Type: QueryTypeNS, Class: QueryClassIN, @@ -226,17 +226,17 @@ VAXA A 10.2.0.27 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 2, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("isi.edu"), Type: QueryTypeMX, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("isi.edu"), Type: QueryTypeMX, Class: QueryClassIN, @@ -256,17 +256,17 @@ VAXA A 10.2.0.27 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("a.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("a.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, @@ -276,17 +276,17 @@ VAXA A 10.2.0.27 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 2, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("venera.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("venera.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, @@ -304,17 +304,17 @@ VAXA A 10.2.0.27 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 2, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("vaxa.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("vaxa.isi.edu"), Type: QueryTypeA, Class: QueryClassIN, @@ -411,17 +411,17 @@ mail IN CNAME @ relay IN CNAME relay.pair.com. `, exp: []*Message{{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("pcguide.com"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("pcguide.com"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -437,17 +437,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 2, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("pcguide.com"), Type: QueryTypeNS, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("pcguide.com"), Type: QueryTypeNS, Class: QueryClassIN, @@ -465,17 +465,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("localhost.pcguide.com"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("localhost.pcguide.com"), Type: QueryTypeA, Class: QueryClassIN, @@ -485,17 +485,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("pcguide.com"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("pcguide.com"), Type: QueryTypeA, Class: QueryClassIN, @@ -505,17 +505,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("pcguide.com"), Type: QueryTypeMX, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("pcguide.com"), Type: QueryTypeMX, Class: QueryClassIN, @@ -526,17 +526,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("www.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("www.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -546,17 +546,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("ftp.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("ftp.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -566,17 +566,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("mail.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("mail.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -586,17 +586,17 @@ relay IN CNAME relay.pair.com. }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("relay.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("relay.pcguide.com"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -673,17 +673,17 @@ dev.kilabit.com. A 127.0.0.1 angularjs.doc A 127.0.0.1 `, exp: []*Message{{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("dev.kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("dev.kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -693,17 +693,17 @@ angularjs.doc A 127.0.0.1 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("dev.kilabit.com"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("dev.kilabit.com"), Type: QueryTypeA, Class: QueryClassIN, @@ -713,17 +713,17 @@ angularjs.doc A 127.0.0.1 }, }}, }, { - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("angularjs.doc.localdomain"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("angularjs.doc.localdomain"), Type: QueryTypeA, Class: QueryClassIN, @@ -788,17 +788,17 @@ func TestMasterParseTXT(t *testing.T) { }{{ in: `@ IN TXT "This is a test"`, exp: []*Message{{ - Header: &SectionHeader{ + Header: SectionHeader{ IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.local"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.local"), Type: QueryTypeTXT, Class: QueryClassIN, diff --git a/lib/dns/message.go b/lib/dns/message.go index 0c8461f1..81cf15f3 100644 --- a/lib/dns/message.go +++ b/lib/dns/message.go @@ -49,11 +49,11 @@ import ( // [1] RFC 1035 - 4.1. Format // type Message struct { - Header *SectionHeader - Question *SectionQuestion - Answer []*ResourceRecord - Authority []*ResourceRecord - Additional []*ResourceRecord + Header SectionHeader + Question SectionQuestion + Answer []ResourceRecord + Authority []ResourceRecord + Additional []ResourceRecord // Slice that hold the result of packing the message or original // message from unpacking. @@ -72,12 +72,12 @@ type Message struct { // func NewMessage() *Message { return &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ IsQuery: true, IsRD: true, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Type: QueryTypeA, Class: QueryClassIN, }, @@ -90,7 +90,7 @@ func NewMessage() *Message { // FilterAnswers return resource record in Answer that match only with // specific query type. // -func (msg *Message) FilterAnswers(t uint16) (answers []*ResourceRecord) { +func (msg *Message) FilterAnswers(t uint16) (answers []ResourceRecord) { for _, rr := range msg.Answer { if rr.Type == t { answers = append(answers, rr) @@ -548,13 +548,13 @@ func (msg *Message) Pack() ([]byte, error) { } for x := 0; x < len(msg.Answer); x++ { - msg.packRR(msg.Answer[x]) + msg.packRR(&msg.Answer[x]) } for x := 0; x < len(msg.Authority); x++ { - msg.packRR(msg.Authority[x]) + msg.packRR(&msg.Authority[x]) } for x := 0; x < len(msg.Additional); x++ { - msg.packRR(msg.Additional[x]) + msg.packRR(&msg.Additional[x]) } msg.dnameOff = nil @@ -724,11 +724,17 @@ func (msg *Message) Unpack() (err error) { var x uint16 for ; x < msg.Header.ANCount; x++ { - rr := NewResourceRecord() + rr := ResourceRecord{ + Name: make([]byte, 0), + Text: &RDataText{}, + rdata: make([]byte, 0), + } + startIdx, err = rr.unpack(msg.Packet, startIdx) if err != nil { return err } + msg.Answer = append(msg.Answer, rr) } @@ -737,7 +743,12 @@ func (msg *Message) Unpack() (err error) { } for x = 0; x < msg.Header.NSCount; x++ { - rr := NewResourceRecord() + rr := ResourceRecord{ + Name: make([]byte, 0), + Text: &RDataText{}, + rdata: make([]byte, 0), + } + startIdx, err = rr.unpack(msg.Packet, startIdx) if err != nil { return err @@ -750,11 +761,17 @@ func (msg *Message) Unpack() (err error) { } for x = 0; x < msg.Header.ARCount; x++ { - rr := NewResourceRecord() + rr := ResourceRecord{ + Name: make([]byte, 0), + Text: &RDataText{}, + rdata: make([]byte, 0), + } + startIdx, err = rr.unpack(msg.Packet, startIdx) if err != nil { return err } + msg.Additional = append(msg.Additional, rr) } @@ -787,7 +804,7 @@ func (msg *Message) UnpackHeaderQuestion() (err error) { } if debug.Value >= 3 { - log.Printf("msg.Question: %s\n", msg.Question) + log.Printf("msg.Question: %s\n", msg.Question.String()) } return nil diff --git a/lib/dns/message_test.go b/lib/dns/message_test.go index 55b49808..20340ef2 100644 --- a/lib/dns/message_test.go +++ b/lib/dns/message_test.go @@ -18,7 +18,7 @@ func TestMessageIsExpired(t *testing.T) { }{{ desc: "Message is not expired", msg: &Message{ - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ TTL: 1, }}, }, @@ -26,7 +26,7 @@ func TestMessageIsExpired(t *testing.T) { }, { desc: "Message is expired", msg: &Message{ - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ TTL: 0, }}, }, @@ -84,7 +84,7 @@ func TestMessagePackQuestion(t *testing.T) { }{{ desc: "Empty name", msg: &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Type: QueryTypeA, Class: QueryClassIN, }, @@ -96,7 +96,7 @@ func TestMessagePackQuestion(t *testing.T) { }, { desc: "Single domain name", msg: &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilaBit"), Type: QueryTypeA, Class: QueryClassIN, @@ -110,7 +110,7 @@ func TestMessagePackQuestion(t *testing.T) { }, { desc: "Two domain names", msg: &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -126,7 +126,7 @@ func TestMessagePackQuestion(t *testing.T) { }, { desc: "Three domain names", msg: &Message{ - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("MAIL.KILABIT.INFO"), Type: QueryTypeA, Class: QueryClassIN, @@ -159,12 +159,12 @@ func TestMessagePack(t *testing.T) { }{{ desc: "Simple query", msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsQuery: true, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.INFO"), Type: QueryTypeA, Class: QueryClassIN, @@ -187,7 +187,7 @@ func TestMessagePack(t *testing.T) { }, { desc: "Response with A RDATA", msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x8cdb, IsQuery: false, Op: OpCodeQuery, @@ -197,12 +197,12 @@ func TestMessagePack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("KILABIT.INFO"), Type: QueryTypeA, Class: QueryClassIN, @@ -211,7 +211,7 @@ func TestMessagePack(t *testing.T) { Value: []byte("103.200.4.162"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Type: QueryTypeOPT, Class: 0x0500, TTL: 0, @@ -277,7 +277,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0xd4a6, IsQuery: false, Op: OpCodeQuery, @@ -288,12 +288,12 @@ func TestMessagePack(t *testing.T) { NSCount: 0, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeNS, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeNS, Class: QueryClassIN, @@ -318,7 +318,7 @@ func TestMessagePack(t *testing.T) { Value: []byte("ns1.dewaweb.com"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Type: QueryTypeOPT, Class: 0x0500, TTL: 0, @@ -350,7 +350,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x8a38, IsQuery: false, Op: OpCodeQuery, @@ -360,12 +360,12 @@ func TestMessagePack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("mail.kilabit.info"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("mail.kilabit.info"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -374,7 +374,7 @@ func TestMessagePack(t *testing.T) { Value: []byte("kilabit.info"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Type: QueryTypeOPT, Class: 0x0500, TTL: 0, @@ -399,19 +399,19 @@ func TestMessagePack(t *testing.T) { 0x51, 0x80, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, IsQuery: false, Op: OpCodeQuery, IsRA: true, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -483,7 +483,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x9eef, IsQuery: false, Op: OpCodeQuery, @@ -493,12 +493,12 @@ func TestMessagePack(t *testing.T) { ANCount: 5, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeMX, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeMX, Class: QueryClassIN, @@ -544,7 +544,7 @@ func TestMessagePack(t *testing.T) { Exchange: []byte("alt4.aspmx.l.GOOGLE.COM"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Type: QueryTypeOPT, Class: 0x0500, TTL: 0, @@ -583,7 +583,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 16253, IsQuery: false, Op: OpCodeQuery, @@ -591,12 +591,12 @@ func TestMessagePack(t *testing.T) { IsRA: true, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -621,7 +621,7 @@ func TestMessagePack(t *testing.T) { Value: []byte("docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Type: QueryTypeOPT, Class: 1280, TTL: 0, @@ -650,7 +650,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x2c90, IsRD: true, IsRA: true, @@ -658,12 +658,12 @@ func TestMessagePack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeAAAA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeAAAA, TTL: 0x53, @@ -672,7 +672,7 @@ func TestMessagePack(t *testing.T) { Value: []byte("2404:6800:4003:c00::8b"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 1280, @@ -751,7 +751,7 @@ func TestMessagePack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, msg: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x2cb4, IsRD: true, IsRA: true, @@ -759,12 +759,12 @@ func TestMessagePack(t *testing.T) { ANCount: 5, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("_xmpp-server._tcp.google.com"), Type: QueryTypeSRV, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("_xmpp-server._tcp.google.com"), Type: QueryTypeSRV, Class: QueryClassIN, @@ -835,7 +835,7 @@ func TestMessagePack(t *testing.T) { Target: []byte("alt3.xmpp-server.l.google.com"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 512, @@ -856,13 +856,13 @@ func TestMessagePack(t *testing.T) { func TestMessageSetAuthoritativeAnswer(t *testing.T) { msgQuery := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsQuery: true, IsAA: true, IsRD: true, }, - Question: &SectionQuestion{}, + Question: SectionQuestion{}, Packet: make([]byte, maxUDPPacketSize), dnameOff: make(map[string]uint16), } @@ -873,13 +873,13 @@ func TestMessageSetAuthoritativeAnswer(t *testing.T) { } msgResponse := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsAA: true, IsRD: true, IsRA: true, }, - Question: &SectionQuestion{}, + Question: SectionQuestion{}, Packet: make([]byte, maxUDPPacketSize), dnameOff: make(map[string]uint16), } @@ -926,13 +926,13 @@ func TestMessageSetAuthoritativeAnswer(t *testing.T) { //nolint:dupl func TestMessageSetQuery(t *testing.T) { msgQuery := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsQuery: true, IsAA: true, IsRD: true, }, - Question: &SectionQuestion{}, + Question: SectionQuestion{}, Packet: make([]byte, maxUDPPacketSize), dnameOff: make(map[string]uint16), } @@ -970,13 +970,13 @@ func TestMessageSetQuery(t *testing.T) { //nolint:dupl func TestMessageSetRecursionDesired(t *testing.T) { msgQuery := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsQuery: true, IsAA: true, IsRD: true, }, - Question: &SectionQuestion{}, + Question: SectionQuestion{}, Packet: make([]byte, maxUDPPacketSize), dnameOff: make(map[string]uint16), } @@ -1013,13 +1013,13 @@ func TestMessageSetRecursionDesired(t *testing.T) { func TestMessageSetResponseCode(t *testing.T) { msgQuery := &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 1, IsQuery: true, IsAA: true, IsRD: true, }, - Question: &SectionQuestion{}, + Question: SectionQuestion{}, Packet: make([]byte, maxUDPPacketSize), dnameOff: make(map[string]uint16), } @@ -1080,7 +1080,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x8cdb, IsQuery: false, Op: OpCodeQuery, @@ -1090,12 +1090,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -1106,7 +1106,7 @@ func TestMessageUnpack(t *testing.T) { Value: []byte("103.200.4.162"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 0x0500, @@ -1156,7 +1156,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0xd4a6, IsQuery: false, Op: OpCodeQuery, @@ -1167,12 +1167,12 @@ func TestMessageUnpack(t *testing.T) { NSCount: 0, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeNS, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeNS, Class: QueryClassIN, @@ -1209,7 +1209,7 @@ func TestMessageUnpack(t *testing.T) { Value: []byte("ns1.dewaweb.com"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 0x0500, @@ -1243,7 +1243,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x8a38, IsQuery: false, Op: OpCodeQuery, @@ -1253,12 +1253,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("mail.kilabit.info"), Type: QueryTypeCNAME, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("mail.kilabit.info"), Type: QueryTypeCNAME, Class: QueryClassIN, @@ -1269,7 +1269,7 @@ func TestMessageUnpack(t *testing.T) { Value: []byte("kilabit.info"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: make([]byte, 0), Type: QueryTypeOPT, Class: 0x0500, @@ -1306,7 +1306,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x01, 0x51, 0x80, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 2, IsQuery: false, Op: OpCodeQuery, @@ -1315,12 +1315,12 @@ func TestMessageUnpack(t *testing.T) { QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -1402,7 +1402,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x9eef, IsQuery: false, Op: OpCodeQuery, @@ -1412,12 +1412,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 5, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeMX, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeMX, Class: QueryClassIN, @@ -1494,7 +1494,7 @@ func TestMessageUnpack(t *testing.T) { Exchange: []byte("alt4.aspmx.l.google.com"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 0x0500, @@ -1551,7 +1551,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 16253, IsQuery: false, Op: OpCodeQuery, @@ -1561,12 +1561,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 3, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -1619,7 +1619,7 @@ func TestMessageUnpack(t *testing.T) { Value: []byte("docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 1280, @@ -1651,7 +1651,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x2c90, IsRD: true, IsRA: true, @@ -1659,12 +1659,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 1, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("google.com"), Type: QueryTypeAAAA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("google.com"), Type: QueryTypeAAAA, Class: QueryClassIN, @@ -1678,7 +1678,7 @@ func TestMessageUnpack(t *testing.T) { Value: []byte("2404:6800:4003:c00::8b"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 1280, @@ -1759,7 +1759,7 @@ func TestMessageUnpack(t *testing.T) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 0x2cb4, IsRD: true, IsRA: true, @@ -1767,12 +1767,12 @@ func TestMessageUnpack(t *testing.T) { ANCount: 5, ARCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("_xmpp-server._tcp.google.com"), Type: QueryTypeSRV, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("_xmpp-server._tcp.google.com"), Type: QueryTypeSRV, Class: QueryClassIN, @@ -1887,7 +1887,7 @@ func TestMessageUnpack(t *testing.T) { Target: []byte("alt3.xmpp-server.l.google.com"), }, }}, - Additional: []*ResourceRecord{{ + Additional: []ResourceRecord{{ Name: []byte{}, Type: QueryTypeOPT, Class: 512, @@ -1912,8 +1912,8 @@ func TestMessageUnpack(t *testing.T) { t.Fatal(err) } - test.Assert(t, "Header", *c.exp.Header, *msg.Header, true) - test.Assert(t, "Question", *c.exp.Question, *msg.Question, true) + test.Assert(t, "Header", c.exp.Header, msg.Header, true) + test.Assert(t, "Question", c.exp.Question, msg.Question, true) test.Assert(t, "Answer Length", len(c.exp.Answer), len(msg.Answer), true) test.Assert(t, "Authority Length", len(c.exp.Authority), len(msg.Authority), true) test.Assert(t, "Additional Length", len(c.exp.Additional), len(msg.Additional), true) diff --git a/lib/dns/resourcerecord.go b/lib/dns/resourcerecord.go index 41626b04..9ee882ed 100644 --- a/lib/dns/resourcerecord.go +++ b/lib/dns/resourcerecord.go @@ -130,26 +130,8 @@ func (rr *ResourceRecord) RData() interface{} { } // -// Reset the resource record fields to zero values. +// String return the text representation of ResourceRecord for human. // -func (rr *ResourceRecord) Reset() { - rr.Name = rr.Name[:0] - rr.Type = QueryTypeZERO - rr.Class = QueryClassZERO - rr.TTL = 0 - rr.rdlen = 0 - rr.rdata = rr.rdata[:0] - rr.Text = nil - rr.SOA = nil - rr.WKS = nil - rr.HInfo = nil - rr.MInfo = nil - rr.MX = nil - rr.OPT = nil - rr.off = 0 - rr.offTTL = 0 -} - func (rr *ResourceRecord) String() string { var buf bytes.Buffer diff --git a/lib/dns/server.go b/lib/dns/server.go index 000dea1f..e37d74fe 100644 --- a/lib/dns/server.go +++ b/lib/dns/server.go @@ -160,12 +160,12 @@ func isResponseValid(req *request, res *Message) bool { } if req.message.Question.Type != res.Question.Type { log.Printf("dns: unmatched response type, got %s want %s\n", - req.message.Question, res.Question) + req.message.Question.String(), res.Question.String()) return false } if req.message.Question.Class != res.Question.Class { log.Printf("dns: unmatched response class, got %s want %s\n", - req.message.Question, res.Question) + req.message.Question.String(), res.Question.String()) return false } @@ -688,7 +688,7 @@ func (srv *Server) processRequest() { fmt.Printf("dns: < %s %d:%s\n", connTypeNames[req.kind], req.message.Header.ID, - req.message.Question) + req.message.Question.String()) } ans, an := srv.caches.get(string(req.message.Question.Name), @@ -703,7 +703,7 @@ func (srv *Server) processRequest() { fmt.Printf("dns: * %s %d:%s\n", connTypeNames[req.kind], req.message.Header.ID, - req.message.Question) + req.message.Question.String()) } req.error(RCodeErrServer) } @@ -716,7 +716,7 @@ func (srv *Server) processRequest() { fmt.Printf("dns: ~ %s %d:%s\n", connTypeNames[req.kind], req.message.Header.ID, - req.message.Question) + req.message.Question.String()) } srv.primaryq <- req } else { @@ -724,7 +724,7 @@ func (srv *Server) processRequest() { fmt.Printf("dns: * %s %d:%s\n", connTypeNames[req.kind], req.message.Header.ID, - req.message.Question) + req.message.Question.String()) } req.error(RCodeErrServer) } @@ -738,7 +738,7 @@ func (srv *Server) processRequest() { if debug.Value >= 1 { fmt.Printf("dns: > %s %d:%s\n", connTypeNames[req.kind], - res.Header.ID, res.Question) + res.Header.ID, res.Question.String()) } _, err := req.writer.Write(res.Packet) @@ -763,7 +763,7 @@ func (srv *Server) processResponse(req *request, res *Message) { if res.Header.RCode != 0 { log.Printf("dns: ! %s %s %d:%s\n", connTypeNames[req.kind], rcodeNames[res.Header.RCode], - res.Header.ID, res.Question) + res.Header.ID, res.Question.String()) return } @@ -774,11 +774,11 @@ func (srv *Server) processResponse(req *request, res *Message) { if inserted { fmt.Printf("dns: + %s %d:%s\n", connTypeNames[req.kind], - res.Header.ID, res.Question) + res.Header.ID, res.Question.String()) } else { fmt.Printf("dns: # %s %d:%s\n", connTypeNames[req.kind], - res.Header.ID, res.Question) + res.Header.ID, res.Question.String()) } } } @@ -872,7 +872,8 @@ func (srv *Server) runDohForwarder(nameserver string, primaryq, fallbackq chan * if debug.Value >= 1 { fmt.Printf("dns: ^ %s %s %d:%s\n", tag, nameserver, - req.message.Header.ID, req.message.Question) + req.message.Header.ID, + req.message.Question.String()) } res, err = forwarder.Query(req.message) @@ -943,7 +944,8 @@ func (srv *Server) runTLSForwarder(nameserver string, primaryq, fallbackq chan * if debug.Value >= 1 { fmt.Printf("dns: ^ %s %s %d:%s\n", tag, nameserver, - req.message.Header.ID, req.message.Question) + req.message.Header.ID, + req.message.Question.String()) } res, err = forwarder.Query(req.message) @@ -997,7 +999,8 @@ func (srv *Server) runTCPForwarder(remoteAddr string, primaryq, fallbackq chan * if debug.Value >= 1 { fmt.Printf("dns: ^ %s %s %d:%s\n", tag, remoteAddr, - req.message.Header.ID, req.message.Question) + req.message.Header.ID, + req.message.Question.String()) } cl, err := NewTCPClient(remoteAddr) @@ -1077,7 +1080,8 @@ func (srv *Server) runUDPForwarder(remoteAddr string, primaryq, fallbackq chan * if debug.Value >= 1 { fmt.Printf("dns: ^ %s %s %d:%s\n", tag, remoteAddr, - req.message.Header.ID, req.message.Question) + req.message.Header.ID, + req.message.Question.String()) } res, err = forwarder.Query(req.message) diff --git a/lib/dns/tcpclient_test.go b/lib/dns/tcpclient_test.go index 8a9d612d..0c1e5b9a 100644 --- a/lib/dns/tcpclient_test.go +++ b/lib/dns/tcpclient_test.go @@ -29,18 +29,18 @@ func TestTCPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 5, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -50,8 +50,8 @@ func TestTCPClientLookup(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", @@ -59,18 +59,18 @@ func TestTCPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 6, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -85,8 +85,8 @@ func TestTCPClientLookup(t *testing.T) { Minimum: 3600, }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", @@ -94,18 +94,18 @@ func TestTCPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 7, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -114,8 +114,8 @@ func TestTCPClientLookup(t *testing.T) { Value: []byte("This is a test server"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }} diff --git a/lib/dns/udpclient_test.go b/lib/dns/udpclient_test.go index 9040d007..44953de3 100644 --- a/lib/dns/udpclient_test.go +++ b/lib/dns/udpclient_test.go @@ -29,18 +29,18 @@ func TestUDPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 8, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeA, Class: QueryClassIN, @@ -50,8 +50,8 @@ func TestUDPClientLookup(t *testing.T) { Value: []byte("127.0.0.1"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:SOA QClass:IN QName:kilabit.info", @@ -59,18 +59,18 @@ func TestUDPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 9, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeSOA, Class: QueryClassIN, @@ -85,8 +85,8 @@ func TestUDPClientLookup(t *testing.T) { Minimum: 3600, }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:TXT QClass:IN QName:kilabit.info", @@ -94,18 +94,18 @@ func TestUDPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 10, IsAA: true, QDCount: 1, ANCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, }, - Answer: []*ResourceRecord{{ + Answer: []ResourceRecord{{ Name: []byte("kilabit.info"), Type: QueryTypeTXT, Class: QueryClassIN, @@ -114,8 +114,8 @@ func TestUDPClientLookup(t *testing.T) { Value: []byte("This is a test server"), }, }}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "QType:AAAA QClass:IN QName:kilabit.info", @@ -123,20 +123,20 @@ func TestUDPClientLookup(t *testing.T) { qclass: QueryClassIN, qname: []byte("kilabit.info"), exp: &Message{ - Header: &SectionHeader{ + Header: SectionHeader{ ID: 11, IsAA: false, RCode: RCodeErrServer, QDCount: 1, }, - Question: &SectionQuestion{ + Question: SectionQuestion{ Name: []byte("kilabit.info"), Type: QueryTypeAAAA, Class: QueryClassIN, }, - Answer: []*ResourceRecord{}, - Authority: []*ResourceRecord{}, - Additional: []*ResourceRecord{}, + Answer: []ResourceRecord{}, + Authority: []ResourceRecord{}, + Additional: []ResourceRecord{}, }, }, { desc: "IsRD:true QType:AAAA QClass:IN QName:kilabit.info", |
