diff --git a/internal/cmd/config.go b/internal/cmd/config.go index caefde24a..6c7e00bde 100644 --- a/internal/cmd/config.go +++ b/internal/cmd/config.go @@ -49,7 +49,7 @@ func createProxyConfig( l *slog.Logger, options *Options, ) (conf *proxy.Config, err error) { - reqHdlr := handler.NewDefault(ctx, &handler.DefaultConfig{ + reqHdlr, err := handler.NewDefault(ctx, &handler.DefaultConfig{ Logger: l.With(slogutil.KeyPrefix, "default_handler"), // TODO(e.burkov): Use the configured message constructor. MessageConstructor: dnsmsg.DefaultMessageConstructor{}, @@ -57,6 +57,9 @@ func createProxyConfig( HostsFiles: options.hostsFiles(ctx, l), FileSystem: osutil.RootDirFS(), }) + if err != nil { + return nil, fmt.Errorf("creating default handler: %w", err) + } conf = &proxy.Config{ Logger: l.With(slogutil.KeyPrefix, proxy.LogPrefix), diff --git a/internal/handler/constructor.go b/internal/handler/constructor.go index 901f492dd..d0ad43214 100644 --- a/internal/handler/constructor.go +++ b/internal/handler/constructor.go @@ -17,8 +17,8 @@ type messageConstructor interface { NewCompressedResponse(req *dns.Msg, code int) (resp *dns.Msg) // NewPTRAnswer creates a new resource record for PTR response with the - // given name and PTR domain. - NewPTRAnswer(name, ptrDomain string) (ans *dns.PTR) + // given FQDN and PTR domain. + NewPTRAnswer(fqdn, ptrDomain string) (ans *dns.PTR) // NewIPResponse creates a new A/AAAA response message for req with the // given IP addresses. All IP addresses must be of the same family. @@ -48,9 +48,9 @@ func (defaultConstructor) NewCompressedResponse(req *dns.Msg, code int) (resp *d // NewPTRAnwer implements the [messageConstructor] interface for // [defaultConstructor]. -func (defaultConstructor) NewPTRAnswer(name, ptrDomain string) (ans *dns.PTR) { +func (defaultConstructor) NewPTRAnswer(fqdn, ptrDomain string) (ans *dns.PTR) { return &dns.PTR{ - Hdr: hdr(name, dns.TypePTR), + Hdr: hdr(fqdn, dns.TypePTR), Ptr: ptrDomain, } } diff --git a/internal/handler/default.go b/internal/handler/default.go index 244e0bf55..a77c7d4b6 100644 --- a/internal/handler/default.go +++ b/internal/handler/default.go @@ -43,12 +43,10 @@ type Default struct { } // NewDefault creates a new [Default] handler. -func NewDefault(ctx context.Context, conf *DefaultConfig) (d *Default) { - l := conf.Logger - +func NewDefault(ctx context.Context, conf *DefaultConfig) (d *Default, err error) { hosts, err := readHosts(conf.FileSystem, conf.HostsFiles) if err != nil { - l.DebugContext(ctx, "creating hosts container", "err", err) + return nil, err } mc, ok := conf.MessageConstructor.(messageConstructor) @@ -63,7 +61,7 @@ func NewDefault(ctx context.Context, conf *DefaultConfig) (d *Default) { isIPv6Halted: conf.HaltIPv6, messages: mc, hosts: hosts, - } + }, nil } // HandleRequest resolves the DNS request within proxyCtx. It only calls diff --git a/internal/handler/default_internal_test.go b/internal/handler/default_internal_test.go index 416d83fd3..d438d51c8 100644 --- a/internal/handler/default_internal_test.go +++ b/internal/handler/default_internal_test.go @@ -53,12 +53,13 @@ func TestDefault_haltAAAA(t *testing.T) { t.Parallel() ctx := testutil.ContextWithTimeout(t, defaultTimeout) - hdlr := NewDefault(ctx, &DefaultConfig{ + hdlr, err := NewDefault(ctx, &DefaultConfig{ Logger: slogutil.NewDiscardLogger(), MessageConstructor: messages, HaltIPv6: false, FileSystem: testdata, }) + require.NoError(t, err) ctx = testutil.ContextWithTimeout(t, defaultTimeout) @@ -70,12 +71,13 @@ func TestDefault_haltAAAA(t *testing.T) { t.Parallel() ctx := testutil.ContextWithTimeout(t, defaultTimeout) - hdlr := NewDefault(ctx, &DefaultConfig{ + hdlr, err := NewDefault(ctx, &DefaultConfig{ Logger: slogutil.NewDiscardLogger(), MessageConstructor: messages, HaltIPv6: true, FileSystem: testdata, }) + require.NoError(t, err) ctx = testutil.ContextWithTimeout(t, defaultTimeout) @@ -91,13 +93,14 @@ func TestDefault_resolveFromHosts(t *testing.T) { messages := dnsmsg.DefaultMessageConstructor{} ctx := testutil.ContextWithTimeout(t, defaultTimeout) - hdlr := NewDefault(ctx, &DefaultConfig{ + hdlr, err := NewDefault(ctx, &DefaultConfig{ MessageConstructor: messages, FileSystem: testdata, Logger: slogutil.NewDiscardLogger(), HostsFiles: []string{path.Join(t.Name(), "hosts")}, HaltIPv6: true, }) + require.NoError(t, err) const ( domainV4 = "ipv4.domain.example" diff --git a/internal/handler/hosts.go b/internal/handler/hosts.go index eac98cf4b..033a0a987 100644 --- a/internal/handler/hosts.go +++ b/internal/handler/hosts.go @@ -101,10 +101,10 @@ func (h *Default) resolveFromHosts(ctx context.Context, req *dns.Msg) (resp *dns return nil } - switch addrsNum, namesNum := len(addrs), len(ptrs); { - case addrsNum != 0: + switch { + case len(addrs) > 0: resp = h.messages.NewIPResponse(req, addrs) - case namesNum != 0: + case len(ptrs) > 0: resp = h.messages.NewCompressedResponse(req, dns.RcodeSuccess) name = req.Question[0].Name for _, ptr := range ptrs {