mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
令 websocket在path访问正确但是不是ws连接时,也进行回落,而不是返回一个错误 将 GetH1RequestMethod_and_PATH_from_Bytes 改名为 ParseH1Request, 且支持 读取header 同时新增了 RawHeader 结构 用于 上述目的。httpLayer还添加了 CanonicalizeHeaderKey 方法。 令Pool使用指针 后,测速从 3200左右上升至3800左右,也不知道是不是这个优化导致的。如果是的话,那也太猛了。
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package tlsLayer
|
||
|
||
import (
|
||
"crypto/tls"
|
||
"net"
|
||
"unsafe"
|
||
|
||
"github.com/e1732a364fed/v2ray_simple/utils"
|
||
"golang.org/x/exp/slices"
|
||
)
|
||
|
||
type Server struct {
|
||
tlsConfig *tls.Config
|
||
}
|
||
|
||
//如 certFile, keyFile 有一项没给出,则会自动生成随机证书
|
||
func NewServer(host, certFile, keyFile string, isInsecure bool, alpnList []string) (*Server, error) {
|
||
|
||
certArray, err := GetCertArrayFromFile(certFile, keyFile)
|
||
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
//发现服务端必须给出 http/1.1 等,否则不会协商出这个alpn,而我们为了回落,是需要协商出所有可能需要的 alpn的。
|
||
|
||
//而且我们如果不提供 h1 和 h2 的alpn的话,很容易被审查者察觉的。
|
||
|
||
if alpnList == nil {
|
||
alpnList = []string{"http/1.1", "h2"}
|
||
} else {
|
||
|
||
if !slices.Contains(alpnList, "http/1.1") {
|
||
alpnList = append(alpnList, "http/1.1")
|
||
}
|
||
if !slices.Contains(alpnList, "h2") {
|
||
alpnList = append(alpnList, "h2")
|
||
}
|
||
}
|
||
|
||
s := &Server{
|
||
tlsConfig: &tls.Config{
|
||
InsecureSkipVerify: isInsecure,
|
||
ServerName: host,
|
||
Certificates: certArray,
|
||
NextProtos: alpnList,
|
||
},
|
||
}
|
||
|
||
return s, nil
|
||
}
|
||
|
||
func (s *Server) Handshake(underlay net.Conn) (tlsConn *Conn, err error) {
|
||
rawTlsConn := tls.Server(underlay, s.tlsConfig)
|
||
err = rawTlsConn.Handshake()
|
||
if err != nil {
|
||
err = utils.ErrInErr{ErrDesc: "tlsLayer: tls握手失败", ErrDetail: err}
|
||
|
||
return
|
||
}
|
||
|
||
tlsConn = &Conn{
|
||
Conn: rawTlsConn,
|
||
ptr: unsafe.Pointer(rawTlsConn),
|
||
}
|
||
|
||
return
|
||
|
||
}
|