mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-28 16:54:15 -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 | ||
|  | } |