github.com/metacubex/mihomo@v1.18.5/constant/dns.go (about)

     1  package constant
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  )
     7  
     8  // DNSModeMapping is a mapping for EnhancedMode enum
     9  var DNSModeMapping = map[string]DNSMode{
    10  	DNSNormal.String():  DNSNormal,
    11  	DNSFakeIP.String():  DNSFakeIP,
    12  	DNSMapping.String(): DNSMapping,
    13  }
    14  
    15  const (
    16  	DNSNormal DNSMode = iota
    17  	DNSFakeIP
    18  	DNSMapping
    19  	DNSHosts
    20  )
    21  
    22  type DNSMode int
    23  
    24  // UnmarshalYAML unserialize EnhancedMode with yaml
    25  func (e *DNSMode) UnmarshalYAML(unmarshal func(any) error) error {
    26  	var tp string
    27  	if err := unmarshal(&tp); err != nil {
    28  		return err
    29  	}
    30  	mode, exist := DNSModeMapping[tp]
    31  	if !exist {
    32  		return errors.New("invalid mode")
    33  	}
    34  	*e = mode
    35  	return nil
    36  }
    37  
    38  // MarshalYAML serialize EnhancedMode with yaml
    39  func (e DNSMode) MarshalYAML() (any, error) {
    40  	return e.String(), nil
    41  }
    42  
    43  // UnmarshalJSON unserialize EnhancedMode with json
    44  func (e *DNSMode) UnmarshalJSON(data []byte) error {
    45  	var tp string
    46  	json.Unmarshal(data, &tp)
    47  	mode, exist := DNSModeMapping[tp]
    48  	if !exist {
    49  		return errors.New("invalid mode")
    50  	}
    51  	*e = mode
    52  	return nil
    53  }
    54  
    55  // MarshalJSON serialize EnhancedMode with json
    56  func (e DNSMode) MarshalJSON() ([]byte, error) {
    57  	return json.Marshal(e.String())
    58  }
    59  
    60  func (e DNSMode) String() string {
    61  	switch e {
    62  	case DNSNormal:
    63  		return "normal"
    64  	case DNSFakeIP:
    65  		return "fake-ip"
    66  	case DNSMapping:
    67  		return "redir-host"
    68  	case DNSHosts:
    69  		return "hosts"
    70  	default:
    71  		return "unknown"
    72  	}
    73  }
    74  
    75  type DNSPrefer int
    76  
    77  const (
    78  	DualStack DNSPrefer = iota
    79  	IPv4Only
    80  	IPv6Only
    81  	IPv4Prefer
    82  	IPv6Prefer
    83  )
    84  
    85  var dnsPreferMap = map[string]DNSPrefer{
    86  	DualStack.String():  DualStack,
    87  	IPv4Only.String():   IPv4Only,
    88  	IPv6Only.String():   IPv6Only,
    89  	IPv4Prefer.String(): IPv4Prefer,
    90  	IPv6Prefer.String(): IPv6Prefer,
    91  }
    92  
    93  func (d DNSPrefer) String() string {
    94  	switch d {
    95  	case DualStack:
    96  		return "dual"
    97  	case IPv4Only:
    98  		return "ipv4"
    99  	case IPv6Only:
   100  		return "ipv6"
   101  	case IPv4Prefer:
   102  		return "ipv4-prefer"
   103  	case IPv6Prefer:
   104  		return "ipv6-prefer"
   105  	default:
   106  		return "dual"
   107  	}
   108  }
   109  
   110  func NewDNSPrefer(prefer string) DNSPrefer {
   111  	if p, ok := dnsPreferMap[prefer]; ok {
   112  		return p
   113  	} else {
   114  		return DualStack
   115  	}
   116  }
   117  
   118  type HTTPVersion string
   119  
   120  const (
   121  	// HTTPVersion11 is HTTP/1.1.
   122  	HTTPVersion11 HTTPVersion = "http/1.1"
   123  	// HTTPVersion2 is HTTP/2.
   124  	HTTPVersion2 HTTPVersion = "h2"
   125  	// HTTPVersion3 is HTTP/3.
   126  	HTTPVersion3 HTTPVersion = "h3"
   127  )