Files
v2ray_simple/tlsLayer/server.go
e1732a364fed 3e7e779920 修订代码; 完善ws; 令Pool使用指针,而不是slice
令 websocket在path访问正确但是不是ws连接时,也进行回落,而不是返回一个错误

将 GetH1RequestMethod_and_PATH_from_Bytes 改名为 ParseH1Request, 且支持 读取header

同时新增了 RawHeader 结构 用于 上述目的。httpLayer还添加了 CanonicalizeHeaderKey 方法。

令Pool使用指针 后,测速从 3200左右上升至3800左右,也不知道是不是这个优化导致的。如果是的话,那也太猛了。
2022-05-07 09:51:45 +08:00

70 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}