116 lines
2.5 KiB
Go
116 lines
2.5 KiB
Go
package netUtil
|
||
|
||
import (
|
||
"net"
|
||
"net/http"
|
||
"strconv"
|
||
"strings"
|
||
|
||
"github.com/gorilla/websocket"
|
||
)
|
||
|
||
// 远程地址解析器
|
||
type RemoteAddrParser struct {
|
||
// 主机地址(IP)
|
||
Host string
|
||
|
||
// 端口
|
||
Port int
|
||
}
|
||
|
||
// 解析远程地址
|
||
func (this *RemoteAddrParser) parseRemoteAddr(remoteAddr string) {
|
||
/*
|
||
http中调用JoinHostPort来给RemoteAddr赋值;它的规则如下:
|
||
JoinHostPort combines host and port into a network address of the
|
||
form "host:port" or, if host contains a colon or a percent sign,
|
||
"[host]:port".
|
||
net包中是类似的
|
||
|
||
所以现在要将RemoteAddr解析成host和port,则需要找到最后一个:,前面的部分则是host;
|
||
如果host包含[],则需要去除
|
||
*/
|
||
|
||
// 找到分隔host、port的:
|
||
index := strings.LastIndex(remoteAddr, ":")
|
||
if index == -1 {
|
||
return
|
||
}
|
||
|
||
// 取出host部分
|
||
this.Host = remoteAddr[:index]
|
||
this.Port, _ = strconv.Atoi(remoteAddr[index+1:])
|
||
|
||
// 处理host中可能的[]
|
||
if strings.Index(this.Host, "[") == -1 {
|
||
return
|
||
}
|
||
this.Host = this.Host[1:]
|
||
|
||
if strings.Index(this.Host, "]") == -1 {
|
||
return
|
||
}
|
||
this.Host = this.Host[:len(this.Host)-1]
|
||
|
||
return
|
||
}
|
||
|
||
// 直接读取IP地址
|
||
func GetHttpAddr(request *http.Request) *RemoteAddrParser {
|
||
this := &RemoteAddrParser{}
|
||
this.parseRemoteAddr(request.RemoteAddr)
|
||
return this
|
||
}
|
||
|
||
// 优先获取header中的代理地址,如果未设置代理地址,则使用request地址
|
||
func GetHttpAddr2(request *http.Request) *RemoteAddrParser {
|
||
remoteAddr := request.Header.Get("HTTP_X_FORWARDED_FOR")
|
||
if len(remoteAddr) > 0 {
|
||
if len(remoteAddr) >= 10 {
|
||
strArray := strings.Split(remoteAddr, ",")
|
||
if len(strArray) > 0 {
|
||
remoteAddr = strArray[0]
|
||
}
|
||
}
|
||
|
||
if len(remoteAddr) > 0 && len(remoteAddr) <= 15 {
|
||
this := &RemoteAddrParser{
|
||
Host: remoteAddr,
|
||
}
|
||
return this
|
||
}
|
||
}
|
||
|
||
remoteAddr = request.Header.Get("X-Real-IP")
|
||
if len(remoteAddr) > 0 {
|
||
this := &RemoteAddrParser{
|
||
Host: remoteAddr,
|
||
}
|
||
return this
|
||
}
|
||
|
||
remoteAddr = request.Header.Get("X-Forwarded-For")
|
||
if len(remoteAddr) > 0 {
|
||
this := &RemoteAddrParser{
|
||
Host: remoteAddr,
|
||
}
|
||
return this
|
||
}
|
||
|
||
this := &RemoteAddrParser{}
|
||
this.parseRemoteAddr(request.RemoteAddr)
|
||
return this
|
||
}
|
||
|
||
func GetWebSocketAddr(conn *websocket.Conn) *RemoteAddrParser {
|
||
this := &RemoteAddrParser{}
|
||
this.parseRemoteAddr(conn.RemoteAddr().String())
|
||
return this
|
||
}
|
||
|
||
func GetConnAddr(conn net.Conn) *RemoteAddrParser {
|
||
this := &RemoteAddrParser{}
|
||
this.parseRemoteAddr(conn.RemoteAddr().String())
|
||
return this
|
||
}
|