package main import ( "fmt" "net" "strings" "time" ) // util.go —— 无状态的纯工具函数(便于单元测试与复用)。 // isPortOpen 检测端口是否有监听者。 func isPortOpen(host string, port int) bool { if host == "" { host = "127.0.0.1" } conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", host, port), 1200*time.Millisecond) if err != nil { return false } _ = conn.Close() return true } // extractHTTPURL 从一行输出里取出 http(s) URL(去除尾随分隔符)。 func extractHTTPURL(line string) string { idx := strings.Index(line, "http") if idx < 0 { return "" } url := strings.TrimSpace(line[idx:]) if i := strings.IndexAny(url, " "); i > 0 { url = url[:i] } if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { return url } return "" } // humanDuration 简短的时长展示。 func humanDuration(d time.Duration) string { if d <= 0 { return "0 秒" } sec := int(d.Seconds()) switch { case sec < 60: return fmt.Sprintf("%d 秒", sec) case sec < 3600: return fmt.Sprintf("%d 分钟", sec/60) default: return fmt.Sprintf("%d 小时 %d 分", sec/3600, (sec%3600)/60) } } // shortURL 菜单标题只显示 origin,避免 token 撑爆标题。 func shortURL(u string) string { if i := strings.Index(u, "?"); i > 0 { return u[:i] } return u }