Feature: support trojan websocket

This commit is contained in:
Dreamacro
2021-10-16 20:19:59 +08:00
parent 68753b4ae1
commit df3a491d40
8 changed files with 154 additions and 23 deletions

View File

@ -8,10 +8,12 @@ import (
"errors"
"io"
"net"
"net/http"
"sync"
"github.com/Dreamacro/clash/common/pool"
"github.com/Dreamacro/clash/transport/socks5"
"github.com/Dreamacro/clash/transport/vmess"
)
const (
@ -38,6 +40,13 @@ type Option struct {
SkipCertVerify bool
}
type WebsocketOption struct {
Host string
Port string
Path string
Headers http.Header
}
type Trojan struct {
option *Option
hexPassword []byte
@ -64,6 +73,29 @@ func (t *Trojan) StreamConn(conn net.Conn) (net.Conn, error) {
return tlsConn, nil
}
func (t *Trojan) StreamWebsocketConn(conn net.Conn, wsOptions *WebsocketOption) (net.Conn, error) {
alpn := defaultALPN
if len(t.option.ALPN) != 0 {
alpn = t.option.ALPN
}
tlsConfig := &tls.Config{
NextProtos: alpn,
MinVersion: tls.VersionTLS12,
InsecureSkipVerify: t.option.SkipCertVerify,
ServerName: t.option.ServerName,
}
return vmess.StreamWebsocketConn(conn, &vmess.WebsocketConfig{
Host: wsOptions.Host,
Port: wsOptions.Port,
Path: wsOptions.Path,
Headers: wsOptions.Headers,
TLS: true,
TLSConfig: tlsConfig,
})
}
func (t *Trojan) WriteHeader(w io.Writer, command Command, socks5Addr []byte) error {
buf := pool.GetBuffer()
defer pool.PutBuffer(buf)