|
|
@ -2,11 +2,13 @@ package protocol |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"io" |
|
|
|
"io" |
|
|
|
|
|
|
|
"unsafe" |
|
|
|
|
|
|
|
|
|
|
|
"v2ray.com/core/common" |
|
|
|
"v2ray.com/core/common" |
|
|
|
"v2ray.com/core/common/buf" |
|
|
|
"v2ray.com/core/common/buf" |
|
|
|
"v2ray.com/core/common/net" |
|
|
|
"v2ray.com/core/common/net" |
|
|
|
"v2ray.com/core/common/serial" |
|
|
|
"v2ray.com/core/common/serial" |
|
|
|
|
|
|
|
"v2ray.com/core/common/stack" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
type AddressOption func(*option) |
|
|
|
type AddressOption func(*option) |
|
|
@ -232,7 +234,13 @@ func (p *addressParser) writeAddress(writer io.Writer, address net.Address) erro |
|
|
|
|
|
|
|
|
|
|
|
switch address.Family() { |
|
|
|
switch address.Family() { |
|
|
|
case net.AddressFamilyIPv4, net.AddressFamilyIPv6: |
|
|
|
case net.AddressFamilyIPv4, net.AddressFamilyIPv6: |
|
|
|
if _, err := writer.Write([]byte{tb}); err != nil { |
|
|
|
var bytes stack.TwoBytes |
|
|
|
|
|
|
|
s := bytes[:1] |
|
|
|
|
|
|
|
s[0] = tb |
|
|
|
|
|
|
|
p := uintptr(unsafe.Pointer(&s)) |
|
|
|
|
|
|
|
v := (*[]byte)(unsafe.Pointer(p)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err := writer.Write(*v); err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
if _, err := writer.Write(address.IP()); err != nil { |
|
|
|
if _, err := writer.Write(address.IP()); err != nil { |
|
|
@ -243,7 +251,15 @@ func (p *addressParser) writeAddress(writer io.Writer, address net.Address) erro |
|
|
|
if isDomainTooLong(domain) { |
|
|
|
if isDomainTooLong(domain) { |
|
|
|
return newError("Super long domain is not supported: ", domain) |
|
|
|
return newError("Super long domain is not supported: ", domain) |
|
|
|
} |
|
|
|
} |
|
|
|
if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil { |
|
|
|
|
|
|
|
|
|
|
|
var bytes stack.TwoBytes |
|
|
|
|
|
|
|
s := bytes[:] |
|
|
|
|
|
|
|
s[0] = tb |
|
|
|
|
|
|
|
s[1] = byte(len(domain)) |
|
|
|
|
|
|
|
p := uintptr(unsafe.Pointer(&s)) |
|
|
|
|
|
|
|
v := (*[]byte)(unsafe.Pointer(p)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err := writer.Write(*v); err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
if _, err := io.WriteString(writer, domain); err != nil { |
|
|
|
if _, err := io.WriteString(writer, domain); err != nil { |
|
|
|