///|
pub fn mbt_string_to_utf8_bytes(str : String, is_filename : Bool) -> Bytes {
let buf = @buffer.new()
@encoding.encode_to(str, buf, encoding=UTF8)
if is_filename {
buf.write_byte((0).to_byte())
}
buf.to_bytes()
}
///|
pub fn utf8_bytes_to_mbt_string(bytes : Bytes) -> String raise {
let decoder = @encoding.decoder(UTF8)
decoder.consume(bytes)
}
///|
fn parse_address(input : String) -> Result[SocketAddr, String] {
// 先尝试解析 IPv6 格式 [addr]:port
if input.has_prefix("[") {
return try_parse_ipv6(input)
}
// 否则尝试解析 IPv4 格式 addr:port
return try_parse_ipv4(input)
}
///|
fn parse_ipv6_str(ip_str : String) -> Result[String, String] {
// 处理特殊压缩情况 (::)
println("Parsing IPv6 string: \{ip_str}")
if ip_str == "::" {
return Ok("0:0:0:0:0:0:0:0")
}
// 分割字符串部分
let parts = ip_str.split(":").collect()
let part_count = parts.length()
// 检查压缩形式 (::)
let mut compression_index = -1
for i in 0..= 0 {
return Err("IPv6 address can't have multiple '::'".to_string())
}
compression_index = i
}
}
// 计算需要填充的零组数量
let mut zero_groups = 8 - part_count + 1
if compression_index >= 0 {
// 压缩形式存在
if zero_groups < 1 {
return Err("IPv6 address has too many parts".to_string())
}
} else {
// 没有压缩形式
zero_groups = 0
guard part_count == 8 else {
return Err("IPv6 address must have 8 parts".to_string())
}
}
// 解析各部分
let groups = Array::make(8, UInt::default())
let mut index = 0
for i in 0.. bytes
Err(e) => return Err(e)
}
groups[index] = (ipv4_bytes[0] << 8) | ipv4_bytes[1]
groups[index + 1] = (ipv4_bytes[2] << 8) | ipv4_bytes[3]
index += 2
} else {
// 解析十六进制组
guard !part.is_empty() else { // 跳过空部分
continue
}
match (try? @strconv.parse_uint(part.to_string(), base=16)) {
Ok(num) => {
guard num <= 0xFFFF else {
return Err("IPv6 group out of range".to_string())
}
groups[index] = num
index += 1
}
_ => return Err("Invalid hex in IPv6 address".to_string())
}
}
}
// 验证最终组数
guard index == 8 else {
return Err("IPv6 address must have 8 groups".to_string())
}
Ok(groups.map(g => g.to_string()).join(":"))
}
///|
fn parse_ipv4_to_bytes(ip_str : @string.View) -> Result[Array[UInt], String] {
let parts = ip_str.split(".").collect()
guard parts.length() == 4 else {
return Err("IPv4 address must have 4 parts")
}
let octets = Array::make(4, UInt::default())
for i in 0..<4 {
let part = parts[i].to_string()
match (try? @strconv.parse_uint(part)) {
Ok(num) => {
guard num >= 0 && num <= 255 else {
return Err("IP segment out of range (0-255)".to_string())
}
octets[i] = num
}
_ => return Err("Invalid number in IP address".to_string())
}
}
Ok(octets)
}
///|
fn try_parse_ipv4(input : String) -> Result[SocketAddr, String] {
// 找到最后一个冒号(端口分隔符)
guard input.rev_find(":") is Some(last_colon) else {
return Err("Invalid IPv4 address format: missing port".to_string())
}
// 提取 IP 部分字符串
let ip_str = input
.charcodes(end=input.offset_of_nth_char(last_colon).unwrap())
.to_string()
// 提取端口部分字符串
let port_str = input
.charcodes(start=input.offset_of_nth_char(last_colon + 1).unwrap())
.to_string()
// 解析 IPv4 地址
let ip = match parse_ipv4_str(ip_str) {
Ok(ip) => ip
Err(e) => return Err(e)
}
// 解析端口号
let port = match parse_port(port_str) {
Ok(port) => port
Err(_) => return Err("Invalid port number".to_string())
}
Ok(SocketAddr::V4(ip, port))
}
// 手动实现 IPv4 地址解析
///|
fn parse_ipv4_str(ip_str : String) -> Result[String, String] {
let parts = Array::new()
let mut current = []
// 分割 IP 字符串为四个部分
for i in 0.. {
// 验证范围 (0-255)
guard num >= 0 && num <= 255 else {
return Err("IP segment out of range (0-255)".to_string())
}
octets[index] = num.to_string()
index += 1
}
_ => return Err("Invalid number in IP address".to_string())
}
}
return Ok(octets.join("."))
}
// IPv6 解析函数
///|
fn try_parse_ipv6(input : String) -> Result[SocketAddr, String] {
// 查找端口分隔符
guard input.rev_find(":") is Some(colon_pos) else {
return Err("Missing port after IPv6 address".to_string())
}
let ip_part = input
.charcodes(end=input.offset_of_nth_char(colon_pos).unwrap())
.to_string()
// 提取端口部分
let port_str = input
.charcodes(start=input.offset_of_nth_char(colon_pos + 1).unwrap())
.to_string()
guard ip_part.trim_space() is [a, .. res, b] && a == '[' && b == ']' else {
return Err("Invalid IPv6 address format".to_string())
}
// 提取 IPv6 地址部分
let ip_str = res.to_string()
// 解析 IPv6 地址(简化的实现)
let ip = match parse_ipv6_str(ip_str) {
Ok(ip) => ip
Err(e) => return Err(e)
}
// 解析端口
let port = match parse_port(port_str) {
Ok(port) => port
Err(_) => return Err("Invalid port number".to_string())
}
Ok(SocketAddr::V6(ip, port, flowinfo=0, scope_id=0))
}
// 端口解析函数
///|
fn parse_port(port_str : String) -> Result[UInt16, String] {
match (try? @strconv.parse_int(port_str)) {
Ok(port) => {
guard port >= 0 && port <= 65535 else {
return Err("Port out of range (0-65535)".to_string())
}
Ok(port.to_uint16())
}
_ => Err("Invalid port number".to_string())
}
}