Files
Dimitry Kolyshev 55d0d6ae59 Pull request: AGDNS-3523-use-dnsproxy-context
Squashed commit of the following:

commit 685390143a84710b42f9948cf46080f7d86c404e
Merge: eb023e9dd 8824fc791
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Mar 27 20:47:11 2026 +0700

    Merge remote-tracking branch 'origin/master' into AGDNS-3523-use-dnsproxy-context

commit eb023e9ddffee03c859b112cfefad79708af4cf6
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Mar 27 15:24:01 2026 +0700

    bamboo: add arm64 test

commit 93acedaf81ba7ffde7020f59978c54365b7db766
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Fri Mar 27 15:22:20 2026 +0700

    bamboo: add arm64 test

commit 99a00e9e2199c522adfbc1e22c05a009f86170ee
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Wed Mar 25 08:17:46 2026 +0700

    dnsforward: imp code

commit e5863521b2c34466e610c0a2de94a749cbefd9dd
Merge: 9783620a7 141501408
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Mon Mar 23 12:07:01 2026 +0700

    Merge remote-tracking branch 'origin/master' into AGDNS-3523-use-dnsproxy-context

commit 9783620a7ed4ec30860da1afd40cedd5e8f78472
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Mon Mar 23 11:55:33 2026 +0700

    dnsforward: imp code

commit 13cb50319d2bfcad5cf9215d610c90314d633bc6
Author: Dimitry Kolyshev <dkolyshev@adguard.com>
Date:   Wed Mar 11 13:20:12 2026 +0700

    dnsforward: use log middleware
2026-03-30 03:48:58 +00:00

63 lines
1.6 KiB
Go

package dnsforward
import (
"context"
"log/slog"
"time"
"github.com/AdguardTeam/AdGuardHome/internal/filtering"
"github.com/AdguardTeam/dnsproxy/proxy"
"github.com/AdguardTeam/golibs/logutil/slogutil"
)
// type check
var _ proxy.Handler = (*Server)(nil)
// ServeDNS implements the [proxy.Handler] interface for [*Server]. ctx must
// contain a logger accessible with [slogutil.LoggerFromContext].
func (s *Server) ServeDNS(ctx context.Context, _ *proxy.Proxy, pctx *proxy.DNSContext) (err error) {
dctx := &dnsContext{
proxyCtx: pctx,
result: &filtering.Result{},
startTime: time.Now(),
}
l := slogutil.MustLoggerFromContext(ctx)
type modProcessFunc func(ctx context.Context, l *slog.Logger, dctx *dnsContext) (rc resultCode)
// Since [*dnsforward.Server] is used as [proxy.Handler], there is no need
// for additional index out of range checking in any of the following
// functions, because the (*proxy.Proxy).handleDNSRequest method performs it
// before calling the appropriate handler.
mods := []modProcessFunc{
s.processInitial,
s.processDDRQuery,
s.processDHCPHosts,
s.processDHCPAddrs,
s.processFilteringBeforeRequest,
s.processUpstream,
s.processFilteringAfterResponse,
s.ipset.process,
s.processQueryLogsAndStats,
}
for _, process := range mods {
r := process(ctx, l, dctx)
switch r {
case resultCodeSuccess:
// continue: call the next filter
case resultCodeFinish:
return nil
case resultCodeError:
return dctx.err
}
}
if pctx.Res != nil {
// Some devices require DNS message compression.
pctx.Res.Compress = true
}
return nil
}