| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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
- }
|