mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	add support unix socket for GRPC (#5943)
This commit is contained in:
		| @@ -3,9 +3,15 @@ package grpc | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/coredns/caddy" | ||||
| 	"github.com/coredns/coredns/pb" | ||||
| 	"github.com/coredns/coredns/plugin/pkg/dnstest" | ||||
| 	"github.com/coredns/coredns/plugin/test" | ||||
|  | ||||
| 	"github.com/miekg/dns" | ||||
| 	"google.golang.org/grpc" | ||||
| @@ -64,3 +70,56 @@ type testServiceClient struct { | ||||
| func (m testServiceClient) Query(ctx context.Context, in *pb.DnsPacket, opts ...grpc.CallOption) (*pb.DnsPacket, error) { | ||||
| 	return m.dnsPacket, m.err | ||||
| } | ||||
|  | ||||
| func TestProxyUnix(t *testing.T) { | ||||
| 	tdir, err := os.MkdirTemp("", "tmp*") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	defer os.RemoveAll(tdir) | ||||
|  | ||||
| 	fd := path.Join(tdir, "test.grpc") | ||||
| 	listener, err := net.Listen("unix", fd) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed to listen: ", err) | ||||
| 	} | ||||
| 	defer listener.Close() | ||||
|  | ||||
| 	server := grpc.NewServer() | ||||
| 	pb.RegisterDnsServiceServer(server, &grpcDnsServiceServer{}) | ||||
|  | ||||
| 	go server.Serve(listener) | ||||
| 	defer server.Stop() | ||||
|  | ||||
| 	c := caddy.NewTestController("dns", "grpc . unix://"+fd) | ||||
| 	g, err := parseGRPC(c) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		t.Errorf("Failed to create forwarder: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	m := new(dns.Msg) | ||||
| 	m.SetQuestion("example.org.", dns.TypeA) | ||||
| 	rec := dnstest.NewRecorder(&test.ResponseWriter{}) | ||||
|  | ||||
| 	if _, err := g.ServeDNS(context.TODO(), rec, m); err != nil { | ||||
| 		t.Fatal("Expected to receive reply, but didn't") | ||||
| 	} | ||||
| 	if x := rec.Msg.Answer[0].Header().Name; x != "example.org." { | ||||
| 		t.Errorf("Expected %s, got %s", "example.org.", x) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type grpcDnsServiceServer struct { | ||||
| 	pb.UnimplementedDnsServiceServer | ||||
| } | ||||
|  | ||||
| func (*grpcDnsServiceServer) Query(ctx context.Context, in *pb.DnsPacket) (*pb.DnsPacket, error) { | ||||
| 	msg := &dns.Msg{} | ||||
| 	msg.Unpack(in.GetMsg()) | ||||
| 	answer := new(dns.Msg) | ||||
| 	answer.Answer = append(answer.Answer, test.A("example.org. IN A 127.0.0.1")) | ||||
| 	answer.SetRcode(msg, dns.RcodeSuccess) | ||||
| 	buf, _ := answer.Pack() | ||||
| 	return &pb.DnsPacket{Msg: buf}, nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user