mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
Some checks are pending
Test / test (1.20, macos-15-intel) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-15-intel) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-15-intel) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-15-intel) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-15-intel) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.25, macos-15-intel) (push) Waiting to run
Test / test (1.25, macos-latest) (push) Waiting to run
Test / test (1.25, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.25, ubuntu-latest) (push) Waiting to run
Test / test (1.25, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package sudoku
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
"strconv"
|
|
)
|
|
|
|
func EncodeAddress(rawAddr string) ([]byte, error) {
|
|
host, portStr, err := net.SplitHostPort(rawAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
portInt, err := strconv.ParseUint(portStr, 10, 16)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var buf []byte
|
|
if ip := net.ParseIP(host); ip != nil {
|
|
if ip4 := ip.To4(); ip4 != nil {
|
|
buf = append(buf, 0x01) // IPv4
|
|
buf = append(buf, ip4...)
|
|
} else {
|
|
buf = append(buf, 0x04) // IPv6
|
|
buf = append(buf, ip...)
|
|
}
|
|
} else {
|
|
if len(host) > 255 {
|
|
return nil, fmt.Errorf("domain too long")
|
|
}
|
|
buf = append(buf, 0x03) // domain
|
|
buf = append(buf, byte(len(host)))
|
|
buf = append(buf, host...)
|
|
}
|
|
|
|
var portBytes [2]byte
|
|
binary.BigEndian.PutUint16(portBytes[:], uint16(portInt))
|
|
buf = append(buf, portBytes[:]...)
|
|
return buf, nil
|
|
}
|
|
|
|
func DecodeAddress(r io.Reader) (string, error) {
|
|
var atyp [1]byte
|
|
if _, err := io.ReadFull(r, atyp[:]); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
switch atyp[0] {
|
|
case 0x01: // IPv4
|
|
var ipBuf [net.IPv4len]byte
|
|
if _, err := io.ReadFull(r, ipBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
var portBuf [2]byte
|
|
if _, err := io.ReadFull(r, portBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
return net.JoinHostPort(net.IP(ipBuf[:]).String(), fmt.Sprint(binary.BigEndian.Uint16(portBuf[:]))), nil
|
|
case 0x04: // IPv6
|
|
var ipBuf [net.IPv6len]byte
|
|
if _, err := io.ReadFull(r, ipBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
var portBuf [2]byte
|
|
if _, err := io.ReadFull(r, portBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
return net.JoinHostPort(net.IP(ipBuf[:]).String(), fmt.Sprint(binary.BigEndian.Uint16(portBuf[:]))), nil
|
|
case 0x03: // domain
|
|
var lengthBuf [1]byte
|
|
if _, err := io.ReadFull(r, lengthBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
l := int(lengthBuf[0])
|
|
hostBuf := make([]byte, l)
|
|
if _, err := io.ReadFull(r, hostBuf); err != nil {
|
|
return "", err
|
|
}
|
|
var portBuf [2]byte
|
|
if _, err := io.ReadFull(r, portBuf[:]); err != nil {
|
|
return "", err
|
|
}
|
|
return net.JoinHostPort(string(hostBuf), fmt.Sprint(binary.BigEndian.Uint16(portBuf[:]))), nil
|
|
default:
|
|
return "", fmt.Errorf("unknown address type: %d", atyp[0])
|
|
}
|
|
}
|