Skip to content

Commit

Permalink
extendable protocol
Browse files Browse the repository at this point in the history
Signed-off-by: He Xian <[email protected]>
  • Loading branch information
hexian000 committed Oct 7, 2024
1 parent 0fea761 commit 22292bb
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 20 deletions.
19 changes: 12 additions & 7 deletions v3/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,21 @@ func (h *TLSHandler) Serve(ctx context.Context, conn net.Conn) {
} else {
slog.Warningf("%q <= %v: connection is not encrypted", h.t.tag, conn.RemoteAddr())
}
req, err := proto.RecvRequest(conn)
if err != nil {
slog.Errorf("%q <= %v: %s", h.t.tag, conn.RemoteAddr(), formats.Error(err))
return
}
t := h.t
req := &proto.ServerHello{
rsp := &proto.ServerMsg{
Type: proto.Type,
Msg: proto.MsgHello,
Service: c.RemoteService,
}
if t.c.RemoteService != "" {
req.Service = t.c.RemoteService
rsp.Service = t.c.RemoteService
}
rsp, err := proto.Server(conn, req)
if err != nil {
if err := proto.SendResponse(conn, rsp); err != nil {
slog.Errorf("%q <= %v: %s", h.t.tag, conn.RemoteAddr(), formats.Error(err))
return
}
Expand All @@ -71,11 +76,11 @@ func (h *TLSHandler) Serve(ctx context.Context, conn net.Conn) {
return
}
h.s.stats.authorized.Add(1)
if rsp.Service != "" {
if tun := h.s.findTunnel(rsp.Service); tun != nil {
if req.Service != "" {
if tun := h.s.findTunnel(req.Service); tun != nil {
t = tun
} else {
slog.Infof("%q <= %v: unknown service %q", t.tag, conn.RemoteAddr(), req.Service)
slog.Infof("%q <= %v: unknown service %q", t.tag, conn.RemoteAddr(), rsp.Service)
}
}
t.addMux(mux, false)
Expand Down
29 changes: 18 additions & 11 deletions v3/proto/proto.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,20 @@ import (

const Type = "application/x-tlswrapper; version=3"

type ClientHello struct {
const (
MsgHello = iota
)

type ClientMsg struct {
Type string `json:"type"`
Service string `json:"service"`
Msg int `json:"msgid"`
Service string `json:"service,omitempty"`
}

type ServerHello struct {
type ServerMsg struct {
Type string `json:"type"`
Service string `json:"service"`
Msg int `json:"msgid"`
Service string `json:"service,omitempty"`
}

var (
Expand Down Expand Up @@ -57,11 +63,11 @@ func recvmsg(conn net.Conn, msg interface{}) error {
return nil
}

func Client(conn net.Conn, req *ClientHello) (*ServerHello, error) {
func Roundtrip(conn net.Conn, req *ClientMsg) (*ServerMsg, error) {
if err := sendmsg(conn, req); err != nil {
return nil, err
}
rsp := &ServerHello{}
rsp := &ServerMsg{}
if err := recvmsg(conn, rsp); err != nil {
return nil, err
}
Expand All @@ -71,16 +77,17 @@ func Client(conn net.Conn, req *ClientHello) (*ServerHello, error) {
return rsp, nil
}

func Server(conn net.Conn, rsp *ServerHello) (*ClientHello, error) {
req := &ClientHello{}
func RecvRequest(conn net.Conn) (*ClientMsg, error) {
req := &ClientMsg{}
if err := recvmsg(conn, req); err != nil {
return nil, err
}
if req.Type != Type {
return nil, ErrUnsupportedProtocol
}
if err := sendmsg(conn, rsp); err != nil {
return nil, err
}
return req, nil
}

func SendResponse(conn net.Conn, rsp *ServerMsg) error {
return sendmsg(conn, rsp)
}
5 changes: 3 additions & 2 deletions v3/tunnel.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,14 +262,15 @@ func (t *Tunnel) dial(ctx context.Context) (*yamux.Session, error) {
} else {
slog.Warningf("%q => %v: connection is not encrypted", t.tag, conn.RemoteAddr())
}
req := &proto.ClientHello{
req := &proto.ClientMsg{
Type: proto.Type,
Msg: proto.MsgHello,
Service: c.RemoteService,
}
if t.c.RemoteService != "" {
req.Service = t.c.RemoteService
}
rsp, err := proto.Client(conn, req)
rsp, err := proto.Roundtrip(conn, req)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 22292bb

Please sign in to comment.