feat: add ws-path to vmess listener

This commit is contained in:
wwqgtxx
2023-10-07 16:45:15 +08:00
parent 5ff4473083
commit 791ecfbb32
5 changed files with 36 additions and 9 deletions

View File

@@ -14,6 +14,7 @@ type VmessServer struct {
Enable bool
Listen string
Users []VmessUser
WsPath string
}
func (t VmessServer) String() string {

View File

@@ -9,7 +9,8 @@ import (
type VmessOption struct {
BaseOption
Users []VmessUser `inbound:"users"`
Users []VmessUser `inbound:"users"`
WsPath string `inbound:"ws-path,omitempty"`
}
type VmessUser struct {
@@ -49,6 +50,7 @@ func NewVmess(options *VmessOption) (*Vmess, error) {
Enable: true,
Listen: base.RawAddress(),
Users: users,
WsPath: options.WsPath,
},
}, nil
}

View File

@@ -3,6 +3,7 @@ package sing_vmess
import (
"context"
"net"
"net/http"
"net/url"
"strings"
@@ -12,6 +13,7 @@ import (
LC "github.com/Dreamacro/clash/listener/config"
"github.com/Dreamacro/clash/listener/sing"
"github.com/Dreamacro/clash/ntp"
clashVMess "github.com/Dreamacro/clash/transport/vmess"
vmess "github.com/metacubex/sing-vmess"
"github.com/sagernet/sing/common"
@@ -65,6 +67,20 @@ func New(config LC.VmessServer, tunnel C.Tunnel, additions ...inbound.Addition)
sl = &Listener{false, config, nil, service}
var httpMux *http.ServeMux
if config.WsPath != "" {
httpMux = http.NewServeMux()
httpMux.HandleFunc(config.WsPath, func(w http.ResponseWriter, r *http.Request) {
conn, err := clashVMess.StreamUpgradedWebsocketConn(w, r)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
sl.HandleConn(conn, tunnel)
})
}
for _, addr := range strings.Split(config.Listen, ",") {
addr := addr
@@ -76,6 +92,10 @@ func New(config LC.VmessServer, tunnel C.Tunnel, additions ...inbound.Addition)
sl.listeners = append(sl.listeners, l)
go func() {
if httpMux != nil {
_ = http.Serve(l, httpMux)
return
}
for {
c, err := l.Accept()
if err != nil {