util.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package inbound
  2. import (
  3. "net"
  4. "net/http"
  5. "net/netip"
  6. "strconv"
  7. "strings"
  8. "github.com/metacubex/mihomo/common/nnip"
  9. C "github.com/metacubex/mihomo/constant"
  10. "github.com/metacubex/mihomo/transport/socks5"
  11. )
  12. func parseSocksAddr(target socks5.Addr) *C.Metadata {
  13. metadata := &C.Metadata{}
  14. switch target[0] {
  15. case socks5.AtypDomainName:
  16. // trim for FQDN
  17. metadata.Host = strings.TrimRight(string(target[2:2+target[1]]), ".")
  18. metadata.DstPort = uint16((int(target[2+target[1]]) << 8) | int(target[2+target[1]+1]))
  19. case socks5.AtypIPv4:
  20. metadata.DstIP = nnip.IpToAddr(net.IP(target[1 : 1+net.IPv4len]))
  21. metadata.DstPort = uint16((int(target[1+net.IPv4len]) << 8) | int(target[1+net.IPv4len+1]))
  22. case socks5.AtypIPv6:
  23. ip6, _ := netip.AddrFromSlice(target[1 : 1+net.IPv6len])
  24. metadata.DstIP = ip6.Unmap()
  25. metadata.DstPort = uint16((int(target[1+net.IPv6len]) << 8) | int(target[1+net.IPv6len+1]))
  26. }
  27. return metadata
  28. }
  29. func parseHTTPAddr(request *http.Request) *C.Metadata {
  30. host := request.URL.Hostname()
  31. port := request.URL.Port()
  32. if port == "" {
  33. port = "80"
  34. }
  35. // trim FQDN (#737)
  36. host = strings.TrimRight(host, ".")
  37. var uint16Port uint16
  38. if port, err := strconv.ParseUint(port, 10, 16); err == nil {
  39. uint16Port = uint16(port)
  40. }
  41. metadata := &C.Metadata{
  42. NetWork: C.TCP,
  43. Host: host,
  44. DstIP: netip.Addr{},
  45. DstPort: uint16Port,
  46. }
  47. ip, err := netip.ParseAddr(host)
  48. if err == nil {
  49. metadata.DstIP = ip
  50. }
  51. return metadata
  52. }