77 lines
1.4 KiB
Go
77 lines
1.4 KiB
Go
package api
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// AddressesHandler 返回服务器所有可用的访问地址
|
|
func AddressesHandler(serverPort string) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
addresses := []gin.H{}
|
|
|
|
addresses = append(addresses, gin.H{
|
|
"title": "localhost",
|
|
"url": "http://localhost" + serverPort,
|
|
})
|
|
|
|
host, _ := os.Hostname()
|
|
|
|
addrs, _ := net.LookupHost(host)
|
|
for _, addr := range addrs {
|
|
if strings.Contains(addr, "%") {
|
|
addr = strings.Split(addr, "%")[0]
|
|
}
|
|
|
|
var url string
|
|
var title string
|
|
|
|
if strings.Contains(addr, ":") {
|
|
url = "http://[" + addr + "]" + serverPort
|
|
title = "IPv6 Address (" + addr + ")"
|
|
} else {
|
|
url = "http://" + addr + serverPort
|
|
title = "IPv4 Address (" + addr + ")"
|
|
}
|
|
addresses = append(addresses, gin.H{
|
|
"title": title,
|
|
"url": url,
|
|
})
|
|
}
|
|
|
|
c.JSON(http.StatusOK, addresses)
|
|
}
|
|
}
|
|
|
|
// 判断是否是私有IP地址
|
|
func isPrivateIP(ip string) bool {
|
|
ipAddr := net.ParseIP(ip)
|
|
if ipAddr == nil {
|
|
return false
|
|
}
|
|
|
|
// 检查常见的私有IP范围
|
|
// 10.0.0.0/8
|
|
if ipAddr[0] == 10 {
|
|
return true
|
|
}
|
|
// 172.16.0.0/12
|
|
if ipAddr[0] == 172 && ipAddr[1] >= 16 && ipAddr[1] <= 31 {
|
|
return true
|
|
}
|
|
// 192.168.0.0/16
|
|
if ipAddr[0] == 192 && ipAddr[1] == 168 {
|
|
return true
|
|
}
|
|
// 127.0.0.0/8 (本地回环)
|
|
if ipAddr[0] == 127 {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|