Hunter0x7c7
2022-08-11 a82f9cb69f63aaeba40c024960deda7d75b9fece
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package dns
 
import (
    "github.com/v2fly/v2ray-core/v5/common/errors"
    "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/common/serial"
    "github.com/v2fly/v2ray-core/v5/features"
)
 
// IPOption is an object for IP query options.
type IPOption struct {
    IPv4Enable bool
    IPv6Enable bool
    FakeEnable bool
}
 
// Client is a V2Ray feature for querying DNS information.
//
// v2ray:api:stable
type Client interface {
    features.Feature
 
    // LookupIP returns IP address for the given domain. IPs may contain IPv4 and/or IPv6 addresses.
    LookupIP(domain string) ([]net.IP, error)
}
 
// IPv4Lookup is an optional feature for querying IPv4 addresses only.
//
// v2ray:api:beta
type IPv4Lookup interface {
    LookupIPv4(domain string) ([]net.IP, error)
}
 
// IPv6Lookup is an optional feature for querying IPv6 addresses only.
//
// v2ray:api:beta
type IPv6Lookup interface {
    LookupIPv6(domain string) ([]net.IP, error)
}
 
// ClientWithIPOption is an optional feature for querying DNS information.
//
// v2ray:api:beta
type ClientWithIPOption interface {
    // GetIPOption returns IPOption for the DNS client.
    GetIPOption() *IPOption
 
    // SetQueryOption sets IPv4Enable and IPv6Enable for the DNS client.
    SetQueryOption(isIPv4Enable, isIPv6Enable bool)
 
    // SetFakeDNSOption sets FakeEnable option for DNS client.
    SetFakeDNSOption(isFakeEnable bool)
}
 
// ClientType returns the type of Client interface. Can be used for implementing common.HasType.
//
// v2ray:api:beta
func ClientType() interface{} {
    return (*Client)(nil)
}
 
// ErrEmptyResponse indicates that DNS query succeeded but no answer was returned.
var ErrEmptyResponse = errors.New("empty response")
 
type RCodeError uint16
 
func (e RCodeError) Error() string {
    return serial.Concat("rcode: ", uint16(e))
}
 
func RCodeFromError(err error) uint16 {
    if err == nil {
        return 0
    }
    cause := errors.Cause(err)
    if r, ok := cause.(RCodeError); ok {
        return uint16(r)
    }
    return 0
}