@@ -2,12 +2,14 @@ package dnscrypt
22
33import (
44 "context"
5+ "log/slog"
56 "net"
67 "strings"
78 "sync"
89 "time"
910
10- "github.com/AdguardTeam/golibs/log"
11+ "github.com/AdguardTeam/golibs/errors"
12+ "github.com/AdguardTeam/golibs/logutil/slogutil"
1113 "github.com/miekg/dns"
1214)
1315
@@ -63,6 +65,10 @@ type Server struct {
6365 // Handler to invoke. If nil, uses DefaultHandler.
6466 Handler Handler
6567
68+ // Logger is a logger instance for Server. If not set, slog.Default() will
69+ // be used.
70+ Logger * slog.Logger
71+
6672 // make sure init is called only once
6773 initOnce sync.Once
6874
@@ -88,7 +94,8 @@ func (s *Server) prepareShutdown() error {
8894 defer s .lock .Unlock ()
8995
9096 if ! s .started {
91- log .Info ("Server is not started" )
97+ s .Logger .Info ("server is not started" )
98+
9299 return ErrServerNotStarted
93100 }
94101
@@ -126,7 +133,7 @@ func (s *Server) prepareShutdown() error {
126133// connections are processed and only after that it leaves the method.
127134// If context deadline is specified, it will exit earlier.
128135func (s * Server ) Shutdown (ctx context.Context ) error {
129- log . Info ("Shutting down the DNSCrypt server" )
136+ s . Logger . Info ("shutting down the DNSCrypt server" )
130137
131138 err := s .prepareShutdown ()
132139 if err != nil {
@@ -137,17 +144,17 @@ func (s *Server) Shutdown(ctx context.Context) error {
137144 closed := make (chan struct {})
138145 go func () {
139146 s .wg .Wait ()
140- log . Info ("Serve goroutines finished their work" )
147+ s . Logger . Info ("serve goroutines finished their work" )
141148 close (closed )
142149 }()
143150
144151 // Wait for either all goroutines finish their work
145152 // Or for the context deadline
146153 select {
147154 case <- closed :
148- log .Info ("DNSCrypt server has been stopped" )
155+ s . Logger .Info ("DNSCrypt server has been stopped" )
149156 case <- ctx .Done ():
150- log .Info ("DNSCrypt server shutdown has timed out" )
157+ s . Logger .Info ("DNSCrypt server shutdown has timed out" )
151158 err = ctx .Err ()
152159 }
153160
@@ -164,6 +171,10 @@ func (s *Server) init() {
164171 if s .UDPSize == 0 {
165172 s .UDPSize = defaultUDPSize
166173 }
174+
175+ if s .Logger == nil {
176+ s .Logger = slog .Default ()
177+ }
167178}
168179
169180// isStarted returns true if the server is processing queries right now
@@ -181,7 +192,7 @@ func (s *Server) serveDNS(rw ResponseWriter, r *dns.Msg) error {
181192 return ErrInvalidQuery
182193 }
183194
184- log . Tracef ( "Handling a DNS query: %s " , r .Question [0 ].Name )
195+ s . Logger . Debug ( "handling a DNS query" , "question " , r .Question [0 ].Name )
185196
186197 handler := s .Handler
187198 if handler == nil {
@@ -190,7 +201,7 @@ func (s *Server) serveDNS(rw ResponseWriter, r *dns.Msg) error {
190201
191202 err := handler .ServeDNS (rw , r )
192203 if err != nil {
193- log . Tracef ( "Error while handing a DNS query: %v" , err )
204+ s . Logger . Debug ( "error while handling a DNS query" , slogutil . KeyError , err )
194205
195206 reply := & dns.Msg {}
196207 reply .SetRcode (r , dns .RcodeServerFailure )
@@ -285,23 +296,20 @@ func (s *Server) handleHandshake(b []byte, certTxt string) ([]byte, error) {
285296}
286297
287298// validate checks if the Server config is properly set
288- func (s * Server ) validate () bool {
299+ func (s * Server ) validate () ( err error ) {
289300 if s .ResolverCert == nil {
290- log .Error ("ResolverCert must be set" )
291- return false
301+ return errors .Annotate (ErrServerConfig , "ResolverCert is required" )
292302 }
293303
294304 if ! s .ResolverCert .VerifyDate () {
295- log .Error ("ResolverCert date is not valid" )
296- return false
305+ return errors .Annotate (ErrServerConfig , "ResolverCert date is not valid" )
297306 }
298307
299308 if s .ProviderName == "" {
300- log .Error ("ProviderName must be set" )
301- return false
309+ return errors .Annotate (ErrServerConfig , "ProviderName must be set" )
302310 }
303311
304- return true
312+ return nil
305313}
306314
307315// getCertTXT serializes the cert TXT record that are to be sent to the client
0 commit comments