mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 18:23:13 -04:00 
			
		
		
		
	Move nonwriter to mw/pkg/nonwriter (#948)
Make it its own package as shared between autopath and federation. Fixes #933
This commit is contained in:
		| @@ -36,6 +36,7 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/coredns/coredns/middleware" | 	"github.com/coredns/coredns/middleware" | ||||||
| 	"github.com/coredns/coredns/middleware/pkg/dnsutil" | 	"github.com/coredns/coredns/middleware/pkg/dnsutil" | ||||||
|  | 	"github.com/coredns/coredns/middleware/pkg/nonwriter" | ||||||
| 	"github.com/coredns/coredns/request" | 	"github.com/coredns/coredns/request" | ||||||
|  |  | ||||||
| 	"github.com/miekg/dns" | 	"github.com/miekg/dns" | ||||||
| @@ -101,7 +102,7 @@ func (a *AutoPath) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Ms | |||||||
| 	for i, s := range searchpath { | 	for i, s := range searchpath { | ||||||
| 		newQName := base + "." + s | 		newQName := base + "." + s | ||||||
| 		ar.Question[0].Name = newQName | 		ar.Question[0].Name = newQName | ||||||
| 		nw := NewNonWriter(w) | 		nw := nonwriter.New(w) | ||||||
|  |  | ||||||
| 		rcode, err := middleware.NextOrFailure(a.Name(), a.Next, ctx, nw, ar) | 		rcode, err := middleware.NextOrFailure(a.Name(), a.Next, ctx, nw, ar) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|   | |||||||
| @@ -1,22 +0,0 @@ | |||||||
| package autopath |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"github.com/miekg/dns" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // NonWriter is a type of ResponseWriter that captures the message, but never writes to the client. |  | ||||||
| type NonWriter struct { |  | ||||||
| 	dns.ResponseWriter |  | ||||||
| 	Msg *dns.Msg |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NewNonWriter makes and returns a new NonWriter. |  | ||||||
| func NewNonWriter(w dns.ResponseWriter) *NonWriter { return &NonWriter{ResponseWriter: w} } |  | ||||||
|  |  | ||||||
| // WriteMsg records the message, but doesn't write it itself. |  | ||||||
| func (r *NonWriter) WriteMsg(res *dns.Msg) error { |  | ||||||
| 	r.Msg = res |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *NonWriter) Write(buf []byte) (int, error) { return len(buf), nil } |  | ||||||
| @@ -17,6 +17,7 @@ import ( | |||||||
| 	"github.com/coredns/coredns/middleware" | 	"github.com/coredns/coredns/middleware" | ||||||
| 	"github.com/coredns/coredns/middleware/etcd/msg" | 	"github.com/coredns/coredns/middleware/etcd/msg" | ||||||
| 	"github.com/coredns/coredns/middleware/pkg/dnsutil" | 	"github.com/coredns/coredns/middleware/pkg/dnsutil" | ||||||
|  | 	"github.com/coredns/coredns/middleware/pkg/nonwriter" | ||||||
| 	"github.com/coredns/coredns/request" | 	"github.com/coredns/coredns/request" | ||||||
|  |  | ||||||
| 	"github.com/miekg/dns" | 	"github.com/miekg/dns" | ||||||
| @@ -67,7 +68,7 @@ func (f *Federation) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns. | |||||||
|  |  | ||||||
| 	// Start the next middleware, but with a nowriter, capture the result, if NXDOMAIN | 	// Start the next middleware, but with a nowriter, capture the result, if NXDOMAIN | ||||||
| 	// perform federation, otherwise just write the result. | 	// perform federation, otherwise just write the result. | ||||||
| 	nw := NewNonWriter(w) | 	nw := nonwriter.New(w) | ||||||
| 	ret, err := middleware.NextOrFailure(f.Name(), f.Next, ctx, nw, r) | 	ret, err := middleware.NextOrFailure(f.Name(), f.Next, ctx, nw, r) | ||||||
|  |  | ||||||
| 	if !middleware.ClientWrite(ret) { | 	if !middleware.ClientWrite(ret) { | ||||||
|   | |||||||
| @@ -1,22 +0,0 @@ | |||||||
| package federation |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"github.com/miekg/dns" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // NonWriter is a type of ResponseWriter that captures the message, but never writes to the client. |  | ||||||
| type NonWriter struct { |  | ||||||
| 	dns.ResponseWriter |  | ||||||
| 	Msg *dns.Msg |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NewNonWriter makes and returns a new NonWriter. |  | ||||||
| func NewNonWriter(w dns.ResponseWriter) *NonWriter { return &NonWriter{ResponseWriter: w} } |  | ||||||
|  |  | ||||||
| // WriteMsg records the message, but doesn't write it itself. |  | ||||||
| func (r *NonWriter) WriteMsg(res *dns.Msg) error { |  | ||||||
| 	r.Msg = res |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *NonWriter) Write(buf []byte) (int, error) { return len(buf), nil } |  | ||||||
							
								
								
									
										23
									
								
								middleware/pkg/nonwriter/nonwriter.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								middleware/pkg/nonwriter/nonwriter.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | // Package nonwriter implements a dns.ResponseWriter that never writes, but captures the dns.Msg being written. | ||||||
|  | package nonwriter | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/miekg/dns" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Writer is a type of ResponseWriter that captures the message, but never writes to the client. | ||||||
|  | type Writer struct { | ||||||
|  | 	dns.ResponseWriter | ||||||
|  | 	Msg *dns.Msg | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // New makes and returns a new NonWriter. | ||||||
|  | func New(w dns.ResponseWriter) *Writer { return &Writer{ResponseWriter: w} } | ||||||
|  |  | ||||||
|  | // WriteMsg records the message, but doesn't write it itself. | ||||||
|  | func (w *Writer) WriteMsg(res *dns.Msg) error { | ||||||
|  | 	w.Msg = res | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w *Writer) Write(buf []byte) (int, error) { return len(buf), nil } | ||||||
							
								
								
									
										19
									
								
								middleware/pkg/nonwriter/nonwriter_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								middleware/pkg/nonwriter/nonwriter_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | package nonwriter | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"github.com/miekg/dns" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestNonWriter(t *testing.T) { | ||||||
|  | 	nw := New(nil) | ||||||
|  | 	m := new(dns.Msg) | ||||||
|  | 	m.SetQuestion("example.org.", dns.TypeA) | ||||||
|  | 	if err := nw.WriteMsg(m); err != nil { | ||||||
|  | 		t.Errorf("Got error when writing to nonwriter: %s", err) | ||||||
|  | 	} | ||||||
|  | 	if x := nw.Msg.Question[0].Name; x != "example.org." { | ||||||
|  | 		t.Errorf("Expacted 'example.org.' got %q:", x) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user