feat(httpprobe): go-hua/http 迁入并更名 httpprobe(HTTP/HTTPS 协议探测)
- 原包名 http 与标准库 net/http 严重混淆, 实为按首部字节探测协议, 更名 httpprobe; spmux 将基于此做单端口分流, 附测试、例程与 README
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
// Package httpprobe 按报文首部字节识别流量是 HTTP 还是 HTTPS,常用于网关/代理协议分流。
|
||||
package httpprobe
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// IsHttps 判断报文是否为 TLS 握手(首字节 0x16 0x03 且包含 host 特征)
|
||||
func IsHttps(data []byte) bool {
|
||||
if len(data) == 0 {
|
||||
return false
|
||||
} else if data[0] != 0x16 {
|
||||
return false
|
||||
} else if data[1] != 0x3 {
|
||||
return false
|
||||
} else if data[3] != 0x1 && data[3] != 0x2 && data[3] != 0x3 && data[3] != 0x4 {
|
||||
return false
|
||||
} else if !bytes.ContainsAny(data, "http") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// IsHttp 判断报文是否为 HTTP 请求(按 GET/POST/PUT 等方法前缀识别)
|
||||
func IsHttp(data []byte) bool {
|
||||
fmt.Print(string(data))
|
||||
if len(data) < 8 {
|
||||
fmt.Println("<8")
|
||||
return false
|
||||
} else if strings.EqualFold(string(data[:3]), "GET") {
|
||||
fmt.Println("GET")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:4]), "HEAD") {
|
||||
fmt.Println("HEAD")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:4]), "POST") {
|
||||
fmt.Println("POST")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:3]), "PUT") {
|
||||
fmt.Println("PUT")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:6]), "DELETE") {
|
||||
fmt.Println("DELETE")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:7]), "CONNECT") {
|
||||
fmt.Println("CONNECT")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:7]), "OPTIONS") {
|
||||
fmt.Println("OPTIONS")
|
||||
return true
|
||||
} else if strings.EqualFold(string(data[:5]), "TRACE") {
|
||||
fmt.Println("TRACE")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user