mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2026-11-02 18:17:20 +09:00
Squashed commit of the following: commit 685390143a84710b42f9948cf46080f7d86c404e Merge: eb023e9dd8824fc791Author: 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: 9783620a7141501408Author: 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
63 lines
1.6 KiB
Go
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
|
|
}
|