diff options
author | 2023-08-14 14:01:13 -0400 | |
---|---|---|
committer | 2023-08-14 11:01:13 -0700 | |
commit | 90d55611a2efbcbdd58c63ecae9f979af4668587 (patch) | |
tree | 29ff3fdcdad38be0f4fdefbd9f351d23795dceff /plugin/pkg | |
parent | eec26e59c63954bd410965ab8fa4663e03e1d9a1 (diff) | |
download | coredns-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.go | 57 | ||||
-rw-r--r-- | plugin/pkg/replacer/replacer_test.go | 6 |
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) + } } } |