mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 18:53:13 -05:00 
			
		
		
		
	Add DNS-over-QUIC server Signed-off-by: jaehnri <joao.henri.cr@gmail.com> Signed-off-by: João Henri <joao.henri.cr@gmail.com>
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package dnsserver
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/binary"
 | 
						|
	"net"
 | 
						|
 | 
						|
	"github.com/miekg/dns"
 | 
						|
	"github.com/quic-go/quic-go"
 | 
						|
)
 | 
						|
 | 
						|
type DoQWriter struct {
 | 
						|
	localAddr  net.Addr
 | 
						|
	remoteAddr net.Addr
 | 
						|
	stream     quic.Stream
 | 
						|
	Msg        *dns.Msg
 | 
						|
}
 | 
						|
 | 
						|
func (w *DoQWriter) Write(b []byte) (int, error) {
 | 
						|
	b = AddPrefix(b)
 | 
						|
	return w.stream.Write(b)
 | 
						|
}
 | 
						|
 | 
						|
func (w *DoQWriter) WriteMsg(m *dns.Msg) error {
 | 
						|
	bytes, err := m.Pack()
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	_, err = w.Write(bytes)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	return w.Close()
 | 
						|
}
 | 
						|
 | 
						|
// Close sends the STREAM FIN signal.
 | 
						|
// The server MUST send the response(s) on the same stream and MUST
 | 
						|
// indicate, after the last response, through the STREAM FIN
 | 
						|
// mechanism that no further data will be sent on that stream.
 | 
						|
// See https://www.rfc-editor.org/rfc/rfc9250#section-4.2-7
 | 
						|
func (w *DoQWriter) Close() error {
 | 
						|
	return w.stream.Close()
 | 
						|
}
 | 
						|
 | 
						|
// AddPrefix adds a 2-byte prefix with the DNS message length.
 | 
						|
func AddPrefix(b []byte) (m []byte) {
 | 
						|
	m = make([]byte, 2+len(b))
 | 
						|
	binary.BigEndian.PutUint16(m, uint16(len(b)))
 | 
						|
	copy(m[2:], b)
 | 
						|
 | 
						|
	return m
 | 
						|
}
 | 
						|
 | 
						|
// These methods implement the dns.ResponseWriter interface from Go DNS.
 | 
						|
func (w *DoQWriter) TsigStatus() error     { return nil }
 | 
						|
func (w *DoQWriter) TsigTimersOnly(b bool) {}
 | 
						|
func (w *DoQWriter) Hijack()               {}
 | 
						|
func (w *DoQWriter) LocalAddr() net.Addr   { return w.localAddr }
 | 
						|
func (w *DoQWriter) RemoteAddr() net.Addr  { return w.remoteAddr }
 |