aboutsummaryrefslogtreecommitdiff
path: root/plugin/pkg
diff options
context:
space:
mode:
authorGravatar Yuheng <chenyuheng99@qq.com> 2023-08-14 14:01:13 -0400
committerGravatar GitHub <noreply@github.com> 2023-08-14 11:01:13 -0700
commit90d55611a2efbcbdd58c63ecae9f979af4668587 (patch)
tree29ff3fdcdad38be0f4fdefbd9f351d23795dceff /plugin/pkg
parenteec26e59c63954bd410965ab8fa4663e03e1d9a1 (diff)
downloadcoredns-90d55611a2efbcbdd58c63ecae9f979af4668587.tar.gz
coredns-90d55611a2efbcbdd58c63ecae9f979af4668587.tar.zst
coredns-90d55611a2efbcbdd58c63ecae9f979af4668587.zip
Plugin dnstap: add support for "extra" field in payload (#6226)
* dnstap: add 'extra' field Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: add setup_test for 'extra' field Signed-off-by: chenyuheng <chenyuheng99@qq.com> * udnstap: update document and test Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: update setup_test for more coverage Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: add TapMessageWithMetadata function to Dnstap Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: adapt dnstap and forward plugins to use TapMessageWithMetadata Signed-off-by: chenyuheng <chenyuheng99@qq.com> * change TapMessageWithMetadata function Signed-off-by: chenyuheng <chenyuheng99@qq.com> * tab inconsistency fix Signed-off-by: chenyuheng <chenyuheng99@qq.com> * fix replacer to support empty state Signed-off-by: chenyuheng <chenyuheng99@qq.com> * add replacer test for empty status parameter Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: update unit test for 'extra' field Signed-off-by: chenyuheng <chenyuheng99@qq.com> * clean up code Signed-off-by: chenyuheng <chenyuheng99@qq.com> * gofmt fix & static analysis fix Signed-off-by: chenyuheng <chenyuheng99@qq.com> * dnstap: refactor Signed-off-by: chenyuheng <chenyuheng99@qq.com> --------- Signed-off-by: chenyuheng <chenyuheng99@qq.com>
Diffstat (limited to 'plugin/pkg')
-rw-r--r--plugin/pkg/replacer/replacer.go57
-rw-r--r--plugin/pkg/replacer/replacer_test.go6
2 files changed, 38 insertions, 25 deletions
diff --git a/plugin/pkg/replacer/replacer.go b/plugin/pkg/replacer/replacer.go
index f927305c2..457244328 100644
--- a/plugin/pkg/replacer/replacer.go
+++ b/plugin/pkg/replacer/replacer.go
@@ -59,31 +59,6 @@ var labels = map[string]struct{}{
// appendValue appends the current value of label.
func appendValue(b []byte, state request.Request, rr *dnstest.Recorder, label string) []byte {
switch label {
- case "{type}":
- return append(b, state.Type()...)
- case "{name}":
- return append(b, state.Name()...)
- case "{class}":
- return append(b, state.Class()...)
- case "{proto}":
- return append(b, state.Proto()...)
- case "{size}":
- return strconv.AppendInt(b, int64(state.Req.Len()), 10)
- case "{remote}":
- return appendAddrToRFC3986(b, state.IP())
- case "{port}":
- return append(b, state.Port()...)
- case "{local}":
- return appendAddrToRFC3986(b, state.LocalIP())
- // Header placeholders (case-insensitive).
- case headerReplacer + "id}":
- return strconv.AppendInt(b, int64(state.Req.Id), 10)
- case headerReplacer + "opcode}":
- return strconv.AppendInt(b, int64(state.Req.Opcode), 10)
- case headerReplacer + "do}":
- return strconv.AppendBool(b, state.Do())
- case headerReplacer + "bufsize}":
- return strconv.AppendInt(b, int64(state.Size()), 10)
// Recorded replacements.
case "{rcode}":
if rr == nil || rr.Msg == nil {
@@ -109,6 +84,38 @@ func appendValue(b []byte, state request.Request, rr *dnstest.Recorder, label st
return appendFlags(b, rr.Msg.MsgHdr)
}
return append(b, EmptyValue...)
+ }
+
+ if (request.Request{}) == state {
+ return append(b, EmptyValue...)
+ }
+
+ switch label {
+ case "{type}":
+ return append(b, state.Type()...)
+ case "{name}":
+ return append(b, state.Name()...)
+ case "{class}":
+ return append(b, state.Class()...)
+ case "{proto}":
+ return append(b, state.Proto()...)
+ case "{size}":
+ return strconv.AppendInt(b, int64(state.Req.Len()), 10)
+ case "{remote}":
+ return appendAddrToRFC3986(b, state.IP())
+ case "{port}":
+ return append(b, state.Port()...)
+ case "{local}":
+ return appendAddrToRFC3986(b, state.LocalIP())
+ // Header placeholders (case-insensitive).
+ case headerReplacer + "id}":
+ return strconv.AppendInt(b, int64(state.Req.Id), 10)
+ case headerReplacer + "opcode}":
+ return strconv.AppendInt(b, int64(state.Req.Opcode), 10)
+ case headerReplacer + "do}":
+ return strconv.AppendBool(b, state.Do())
+ case headerReplacer + "bufsize}":
+ return strconv.AppendInt(b, int64(state.Size()), 10)
default:
return append(b, EmptyValue...)
}
diff --git a/plugin/pkg/replacer/replacer_test.go b/plugin/pkg/replacer/replacer_test.go
index 28bb08d7a..aa8ac6fd2 100644
--- a/plugin/pkg/replacer/replacer_test.go
+++ b/plugin/pkg/replacer/replacer_test.go
@@ -256,6 +256,12 @@ func TestLabels(t *testing.T) {
if repl != expect[lbl] {
t.Errorf("Expected value %q, got %q", expect[lbl], repl)
}
+
+ // test empty state and nil recorder won't panic
+ repl_empty := replacer.Replace(ctx, request.Request{}, nil, lbl)
+ if repl_empty != EmptyValue {
+ t.Errorf("Expected empty value %q, got %q", EmptyValue, repl_empty)
+ }
}
}