mirror of
https://github.com/coredns/coredns.git
synced 2026-07-10 17:50:12 -04:00
fix(log): synthesize deferred error responses (#8200)
Signed-off-by: immanuwell <pchpr.00@list.ru>
This commit is contained in:
committed by
GitHub
parent
1936a2bb40
commit
1539f9b7d6
@@ -35,6 +35,13 @@ func (l Logger) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg)
|
|||||||
|
|
||||||
rrw := dnstest.NewRecorder(w)
|
rrw := dnstest.NewRecorder(w)
|
||||||
rc, err := plugin.NextOrFailure(l.Name(), l.Next, ctx, rrw, r)
|
rc, err := plugin.NextOrFailure(l.Name(), l.Next, ctx, rrw, r)
|
||||||
|
if rrw.Msg == nil && !plugin.ClientWrite(rc) {
|
||||||
|
msg := new(dns.Msg)
|
||||||
|
msg.SetRcode(r, rc)
|
||||||
|
rrw.Msg = msg
|
||||||
|
rrw.Rcode = rc
|
||||||
|
rrw.Len = msg.Len()
|
||||||
|
}
|
||||||
|
|
||||||
tpe, _ := response.Typify(rrw.Msg, time.Now().UTC())
|
tpe, _ := response.Typify(rrw.Msg, time.Now().UTC())
|
||||||
metadata.SetValueFunc(ctx, "log/type", func() string {
|
metadata.SetValueFunc(ctx, "log/type", func() string {
|
||||||
|
|||||||
@@ -112,6 +112,80 @@ func TestLoggedClassError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoggedSynthesizesDeferredServerFailure(t *testing.T) {
|
||||||
|
rule := Rule{
|
||||||
|
NameScope: ".",
|
||||||
|
Format: DefaultLogFormat,
|
||||||
|
Class: map[response.Class]struct{}{response.All: {}},
|
||||||
|
}
|
||||||
|
|
||||||
|
var f bytes.Buffer
|
||||||
|
log.SetOutput(&f)
|
||||||
|
|
||||||
|
logger := Logger{
|
||||||
|
Rules: []Rule{rule},
|
||||||
|
repl: replacer.New(),
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.TODO()
|
||||||
|
r := new(dns.Msg)
|
||||||
|
r.SetQuestion("example.org.", dns.TypeA)
|
||||||
|
|
||||||
|
rec := dnstest.NewRecorder(&test.ResponseWriter{})
|
||||||
|
|
||||||
|
rcode, err := logger.ServeDNS(ctx, rec, r)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("expected no next plugin error")
|
||||||
|
}
|
||||||
|
if rcode != dns.RcodeServerFailure {
|
||||||
|
t.Fatalf("expected SERVFAIL rcode, got %d", rcode)
|
||||||
|
}
|
||||||
|
|
||||||
|
logged := f.String()
|
||||||
|
if !strings.Contains(logged, "SERVFAIL") {
|
||||||
|
t.Fatalf("expected SERVFAIL in log output, got %q", logged)
|
||||||
|
}
|
||||||
|
if strings.Contains(logged, "\"OTHERERROR ") {
|
||||||
|
t.Fatalf("expected synthesized server error classification, got %q", logged)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoggedSynthesizesDeferredRefused(t *testing.T) {
|
||||||
|
rule := Rule{
|
||||||
|
NameScope: ".",
|
||||||
|
Format: DefaultLogFormat,
|
||||||
|
Class: map[response.Class]struct{}{response.All: {}},
|
||||||
|
}
|
||||||
|
|
||||||
|
var f bytes.Buffer
|
||||||
|
log.SetOutput(&f)
|
||||||
|
|
||||||
|
logger := Logger{
|
||||||
|
Rules: []Rule{rule},
|
||||||
|
Next: test.NextHandler(dns.RcodeRefused, nil),
|
||||||
|
repl: replacer.New(),
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.TODO()
|
||||||
|
r := new(dns.Msg)
|
||||||
|
r.SetQuestion("example.org.", dns.TypeA)
|
||||||
|
|
||||||
|
rec := dnstest.NewRecorder(&test.ResponseWriter{})
|
||||||
|
|
||||||
|
rcode, err := logger.ServeDNS(ctx, rec, r)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if rcode != dns.RcodeRefused {
|
||||||
|
t.Fatalf("expected REFUSED rcode, got %d", rcode)
|
||||||
|
}
|
||||||
|
|
||||||
|
logged := f.String()
|
||||||
|
if !strings.Contains(logged, "REFUSED") {
|
||||||
|
t.Fatalf("expected REFUSED in log output, got %q", logged)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestLogged(t *testing.T) {
|
func TestLogged(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
Rules []Rule
|
Rules []Rule
|
||||||
|
|||||||
Reference in New Issue
Block a user