mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package proxy
 | ||
|  | 
 | ||
|  | import (
 | ||
|  | 	"time"
 | ||
|  | 
 | ||
|  | 	"github.com/coredns/coredns/plugin/dnstap"
 | ||
|  | 	"github.com/coredns/coredns/request"
 | ||
|  | 
 | ||
|  | 	tap "github.com/dnstap/golang-dnstap"
 | ||
|  | 	"github.com/miekg/dns"
 | ||
|  | 	"golang.org/x/net/context"
 | ||
|  | )
 | ||
|  | 
 | ||
|  | func toDnstap(ctx context.Context, host string, ex Exchanger, state request.Request, reply *dns.Msg, start time.Time) error {
 | ||
|  | 	tapper := dnstap.TapperFromContext(ctx)
 | ||
|  | 	if tapper == nil {
 | ||
|  | 		return nil
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	// Query
 | ||
|  | 	b := tapper.TapBuilder()
 | ||
|  | 	b.TimeSec = uint64(start.Unix())
 | ||
|  | 	if err := b.HostPort(host); err != nil {
 | ||
|  | 		return err
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	t := ex.Transport()
 | ||
|  | 	if t == "" {
 | ||
|  | 		t = state.Proto()
 | ||
|  | 	}
 | ||
|  | 	if t == "tcp" {
 | ||
|  | 		b.SocketProto = tap.SocketProtocol_TCP
 | ||
|  | 	} else {
 | ||
|  | 		b.SocketProto = tap.SocketProtocol_UDP
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if err := b.Msg(state.Req); err != nil {
 | ||
|  | 		return err
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	if err := tapper.TapMessage(b.ToOutsideQuery(tap.Message_FORWARDER_QUERY)); err != nil {
 | ||
|  | 		return err
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	// Response
 | ||
|  | 	if reply != nil {
 | ||
|  | 		b.TimeSec = uint64(time.Now().Unix())
 | ||
|  | 		if err := b.Msg(reply); err != nil {
 | ||
|  | 			return err
 | ||
|  | 		}
 | ||
|  | 		return tapper.TapMessage(b.ToOutsideResponse(tap.Message_FORWARDER_RESPONSE))
 | ||
|  | 	}
 | ||
|  | 	return nil
 | ||
|  | }
 |