improve ss
This commit is contained in:
parent
e2995ece96
commit
ec8615991b
@ -6,13 +6,13 @@ import (
|
||||
|
||||
"github.com/go-gost/gost/pkg/bypass"
|
||||
"github.com/go-gost/gost/pkg/chain"
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
"github.com/go-gost/gost/pkg/components/dialer"
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
"github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/config"
|
||||
"github.com/go-gost/gost/pkg/connector"
|
||||
"github.com/go-gost/gost/pkg/dialer"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
"github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/go-gost/gost/pkg/service"
|
||||
)
|
||||
|
@ -23,6 +23,23 @@ services:
|
||||
keepAlive: 15s
|
||||
chain: chain01
|
||||
# bypass: bypass01
|
||||
- name: ss+tcp
|
||||
url: "ss://chacha20:gost@:8000"
|
||||
addr: ":8338"
|
||||
handler:
|
||||
type: ss
|
||||
metadata:
|
||||
method: AES-256-GCM
|
||||
password: gost
|
||||
key: gost
|
||||
readTimeout: 5s
|
||||
retry: 3
|
||||
listener:
|
||||
type: tcp
|
||||
metadata:
|
||||
keepAlive: 15s
|
||||
chain: chain01
|
||||
# bypass: bypass01
|
||||
|
||||
chains:
|
||||
- name: chain01
|
||||
|
@ -2,29 +2,29 @@ package main
|
||||
|
||||
import (
|
||||
// Register connectors
|
||||
_ "github.com/go-gost/gost/pkg/components/connector/http"
|
||||
_ "github.com/go-gost/gost/pkg/components/connector/ss"
|
||||
_ "github.com/go-gost/gost/pkg/connector/http"
|
||||
_ "github.com/go-gost/gost/pkg/connector/ss"
|
||||
|
||||
// Register dialers
|
||||
_ "github.com/go-gost/gost/pkg/components/dialer/tcp"
|
||||
_ "github.com/go-gost/gost/pkg/dialer/tcp"
|
||||
|
||||
// Register handlers
|
||||
_ "github.com/go-gost/gost/pkg/components/handler/http"
|
||||
_ "github.com/go-gost/gost/pkg/components/handler/ss"
|
||||
_ "github.com/go-gost/gost/pkg/components/handler/ssu"
|
||||
_ "github.com/go-gost/gost/pkg/handler/http"
|
||||
_ "github.com/go-gost/gost/pkg/handler/ss"
|
||||
_ "github.com/go-gost/gost/pkg/handler/ssu"
|
||||
|
||||
// Register listeners
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/ftcp"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/http2"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/http2/h2"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/kcp"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/obfs/http"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/obfs/tls"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/quic"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/tcp"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/tls"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/tls/mux"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/udp"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/ws"
|
||||
_ "github.com/go-gost/gost/pkg/components/listener/ws/mux"
|
||||
_ "github.com/go-gost/gost/pkg/listener/ftcp"
|
||||
_ "github.com/go-gost/gost/pkg/listener/http2"
|
||||
_ "github.com/go-gost/gost/pkg/listener/http2/h2"
|
||||
_ "github.com/go-gost/gost/pkg/listener/kcp"
|
||||
_ "github.com/go-gost/gost/pkg/listener/obfs/http"
|
||||
_ "github.com/go-gost/gost/pkg/listener/obfs/tls"
|
||||
_ "github.com/go-gost/gost/pkg/listener/quic"
|
||||
_ "github.com/go-gost/gost/pkg/listener/tcp"
|
||||
_ "github.com/go-gost/gost/pkg/listener/tls"
|
||||
_ "github.com/go-gost/gost/pkg/listener/tls/mux"
|
||||
_ "github.com/go-gost/gost/pkg/listener/udp"
|
||||
_ "github.com/go-gost/gost/pkg/listener/ws"
|
||||
_ "github.com/go-gost/gost/pkg/listener/ws/mux"
|
||||
)
|
||||
|
@ -101,6 +101,10 @@ func (r *Route) Last() *Node {
|
||||
}
|
||||
|
||||
func (r *Route) Path() (path []*Node) {
|
||||
if r == nil || len(r.nodes) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, node := range r.nodes {
|
||||
if node.transport != nil && node.transport.route != nil {
|
||||
path = append(path, node.transport.route.Path()...)
|
||||
|
@ -4,8 +4,8 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
"github.com/go-gost/gost/pkg/components/dialer"
|
||||
"github.com/go-gost/gost/pkg/connector"
|
||||
"github.com/go-gost/gost/pkg/dialer"
|
||||
)
|
||||
|
||||
type Transport struct {
|
||||
|
@ -1,47 +0,0 @@
|
||||
package ss
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.RegiserConnector("ss", NewConnector)
|
||||
}
|
||||
|
||||
type Connector struct {
|
||||
md metadata
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
func NewConnector(opts ...connector.Option) connector.Connector {
|
||||
options := &connector.Options{}
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
|
||||
return &Connector{
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Connector) Init(md md.Metadata) (err error) {
|
||||
return c.parseMetadata(md)
|
||||
}
|
||||
|
||||
func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address string, opts ...connector.ConnectOption) (net.Conn, error) {
|
||||
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func (c *Connector) parseMetadata(md md.Metadata) (err error) {
|
||||
c.md.method = md.GetString(method)
|
||||
c.md.password = md.GetString(password)
|
||||
|
||||
return
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
package ss
|
||||
|
||||
const (
|
||||
method = "method"
|
||||
password = "password"
|
||||
)
|
||||
|
||||
type metadata struct {
|
||||
method string
|
||||
password string
|
||||
}
|
@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/metadata"
|
||||
)
|
||||
|
||||
// Connector is responsible for connecting to the destination address.
|
@ -11,9 +11,9 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/connector"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -56,9 +56,11 @@ func (c *httpConnector) Connect(ctx context.Context, conn net.Conn, network, add
|
||||
req.Header.Set("Proxy-Connection", "keep-alive")
|
||||
|
||||
c.logger = c.logger.WithFields(map[string]interface{}{
|
||||
"src": conn.LocalAddr().String(),
|
||||
"dst": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
"remote": conn.RemoteAddr().String(),
|
||||
"target": address,
|
||||
})
|
||||
c.logger.Infof("connect: ", address)
|
||||
|
||||
if user := c.md.User; user != nil {
|
||||
u := user.Username()
|
99
pkg/connector/ss/connector.go
Normal file
99
pkg/connector/ss/connector.go
Normal file
@ -0,0 +1,99 @@
|
||||
package ss
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/gosocks5"
|
||||
"github.com/go-gost/gost/pkg/connector"
|
||||
"github.com/go-gost/gost/pkg/internal/bufpool"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.RegiserConnector("ss", NewConnector)
|
||||
}
|
||||
|
||||
type Connector struct {
|
||||
md metadata
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
func NewConnector(opts ...connector.Option) connector.Connector {
|
||||
options := &connector.Options{}
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
|
||||
return &Connector{
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Connector) Init(md md.Metadata) (err error) {
|
||||
return c.parseMetadata(md)
|
||||
}
|
||||
|
||||
func (c *Connector) Connect(ctx context.Context, conn net.Conn, network, address string, opts ...connector.ConnectOption) (net.Conn, error) {
|
||||
c.logger = c.logger.WithFields(map[string]interface{}{
|
||||
"remote": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
"target": address,
|
||||
})
|
||||
c.logger.Infof("connect: ", address)
|
||||
|
||||
socksAddr, err := gosocks5.NewAddr(address)
|
||||
if err != nil {
|
||||
c.logger.Error("parse addr: ", err)
|
||||
return nil, err
|
||||
}
|
||||
rawaddr := bufpool.Get(512)
|
||||
defer bufpool.Put(rawaddr)
|
||||
|
||||
n, err := socksAddr.Encode(rawaddr)
|
||||
if err != nil {
|
||||
c.logger.Error("encoding addr: ", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
conn.SetDeadline(time.Now().Add(c.md.connectTimeout))
|
||||
defer conn.SetDeadline(time.Time{})
|
||||
|
||||
if c.md.cipher != nil {
|
||||
conn = c.md.cipher.StreamConn(conn)
|
||||
}
|
||||
|
||||
var sc net.Conn
|
||||
if c.md.noDelay {
|
||||
sc = utils.ShadowConn(conn, nil)
|
||||
// write the addr at once.
|
||||
if _, err := sc.Write(rawaddr[:n]); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
// cache the header
|
||||
sc = utils.ShadowConn(conn, rawaddr[:n])
|
||||
}
|
||||
|
||||
return sc, nil
|
||||
}
|
||||
|
||||
func (c *Connector) parseMetadata(md md.Metadata) (err error) {
|
||||
c.md.cipher, err = utils.ShadowCipher(
|
||||
md.GetString(method),
|
||||
md.GetString(password),
|
||||
md.GetString(key),
|
||||
)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
c.md.connectTimeout = md.GetDuration(connectTimeout)
|
||||
c.md.noDelay = md.GetBool(noDelay)
|
||||
|
||||
return
|
||||
}
|
21
pkg/connector/ss/metadata.go
Normal file
21
pkg/connector/ss/metadata.go
Normal file
@ -0,0 +1,21 @@
|
||||
package ss
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
)
|
||||
|
||||
const (
|
||||
method = "method"
|
||||
password = "password"
|
||||
key = "key"
|
||||
connectTimeout = "timeout"
|
||||
noDelay = "noDelay"
|
||||
)
|
||||
|
||||
type metadata struct {
|
||||
cipher core.Cipher
|
||||
connectTimeout time.Duration
|
||||
noDelay bool
|
||||
}
|
@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/metadata"
|
||||
)
|
||||
|
||||
// Transporter is responsible for dialing to the proxy server.
|
@ -4,9 +4,9 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/dialer"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/dialer"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/metadata"
|
||||
)
|
||||
|
||||
type Handler interface {
|
@ -20,9 +20,9 @@ import (
|
||||
"github.com/go-gost/gost/pkg/auth"
|
||||
"github.com/go-gost/gost/pkg/bypass"
|
||||
"github.com/go-gost/gost/pkg/chain"
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -89,11 +89,20 @@ func (h *httpHandler) parseMetadata(md md.Metadata) error {
|
||||
func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||
defer conn.Close()
|
||||
|
||||
start := time.Now()
|
||||
|
||||
h.logger = h.logger.WithFields(map[string]interface{}{
|
||||
"src": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
"remote": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
})
|
||||
|
||||
h.logger.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr())
|
||||
defer func() {
|
||||
h.logger.WithFields(map[string]interface{}{
|
||||
"duration": time.Since(start),
|
||||
}).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr())
|
||||
}()
|
||||
|
||||
req, err := http.ReadRequest(bufio.NewReader(conn))
|
||||
if err != nil {
|
||||
h.logger.Error(err)
|
||||
@ -109,7 +118,8 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
|
||||
return
|
||||
}
|
||||
|
||||
// try to get the actual host.
|
||||
// Try to get the actual host.
|
||||
// Compatible with GOST 2.x.
|
||||
if v := req.Header.Get("Gost-Target"); v != "" {
|
||||
if h, err := h.decodeServerName(v); err == nil {
|
||||
req.Host = h
|
||||
@ -117,6 +127,13 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
|
||||
}
|
||||
req.Header.Del("Gost-Target")
|
||||
|
||||
if v := req.Header.Get("X-Gost-Target"); v != "" {
|
||||
if h, err := h.decodeServerName(v); err == nil {
|
||||
req.Host = h
|
||||
}
|
||||
}
|
||||
req.Header.Del("X-Gost-Target")
|
||||
|
||||
host := req.Host
|
||||
if _, port, _ := net.SplitHostPort(host); port == "" {
|
||||
host = net.JoinHostPort(host, "80")
|
||||
@ -134,6 +151,7 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
|
||||
dump, _ := httputil.DumpRequest(req, false)
|
||||
h.logger.Debug(string(dump))
|
||||
}
|
||||
h.logger.Infof("%s > %s", conn.RemoteAddr(), host)
|
||||
|
||||
resp := &http.Response{
|
||||
ProtoMajor: 1,
|
||||
@ -202,7 +220,6 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
|
||||
dump, _ := httputil.DumpResponse(resp, false)
|
||||
h.logger.Debug(string(dump))
|
||||
}
|
||||
h.logger.Error(err)
|
||||
return
|
||||
}
|
||||
defer cc.Close()
|
||||
@ -227,7 +244,9 @@ func (h *httpHandler) handleRequest(ctx context.Context, conn net.Conn, req *htt
|
||||
}
|
||||
}
|
||||
|
||||
h.logger.Infof("%s <> %s", conn.RemoteAddr(), host)
|
||||
handler.Transport(conn, cc)
|
||||
h.logger.Infof("%s >< %s", conn.RemoteAddr(), host)
|
||||
}
|
||||
|
||||
func (h *httpHandler) dial(ctx context.Context, addr string) (conn net.Conn, err error) {
|
||||
@ -239,12 +258,14 @@ func (h *httpHandler) dial(ctx context.Context, addr string) (conn net.Conn, err
|
||||
for i := 0; i < count; i++ {
|
||||
route := h.chain.GetRouteFor(addr)
|
||||
|
||||
buf := bytes.Buffer{}
|
||||
for _, node := range route.Path() {
|
||||
fmt.Fprintf(&buf, "%s@%s -> ", node.Name(), node.Addr())
|
||||
if h.logger.IsLevelEnabled(logger.DebugLevel) {
|
||||
buf := bytes.Buffer{}
|
||||
for _, node := range route.Path() {
|
||||
fmt.Fprintf(&buf, "%s@%s > ", node.Name(), node.Addr())
|
||||
}
|
||||
fmt.Fprintf(&buf, "%s", addr)
|
||||
h.logger.Debugf("route(retry=%d): %s", i, buf.String())
|
||||
}
|
||||
fmt.Fprintf(&buf, "%s", addr)
|
||||
h.logger.Infof("route(retry=%d): %s", i, buf.String())
|
||||
|
||||
/*
|
||||
// forward http request
|
@ -3,18 +3,20 @@ package ss
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/gosocks5"
|
||||
"github.com/go-gost/gost/pkg/bypass"
|
||||
"github.com/go-gost/gost/pkg/chain"
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -48,34 +50,45 @@ func (h *ssHandler) Init(md md.Metadata) (err error) {
|
||||
func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||
defer conn.Close()
|
||||
|
||||
start := time.Now()
|
||||
|
||||
h.logger = h.logger.WithFields(map[string]interface{}{
|
||||
"src": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
"remote": conn.RemoteAddr().String(),
|
||||
"local": conn.LocalAddr().String(),
|
||||
})
|
||||
|
||||
h.logger.Infof("%s <> %s", conn.RemoteAddr(), conn.LocalAddr())
|
||||
defer func() {
|
||||
h.logger.WithFields(map[string]interface{}{
|
||||
"duration": time.Since(start),
|
||||
}).Infof("%s >< %s", conn.RemoteAddr(), conn.LocalAddr())
|
||||
}()
|
||||
|
||||
sc := conn
|
||||
if h.md.cipher != nil {
|
||||
conn = &shadowConn{
|
||||
Conn: h.md.cipher.StreamConn(conn),
|
||||
}
|
||||
sc = utils.ShadowConn(h.md.cipher.StreamConn(conn), nil)
|
||||
}
|
||||
|
||||
if h.md.readTimeout > 0 {
|
||||
conn.SetReadDeadline(time.Now().Add(h.md.readTimeout))
|
||||
sc.SetReadDeadline(time.Now().Add(h.md.readTimeout))
|
||||
}
|
||||
|
||||
addr := &gosocks5.Addr{}
|
||||
_, err := addr.ReadFrom(conn)
|
||||
_, err := addr.ReadFrom(sc)
|
||||
if err != nil {
|
||||
h.logger.Error(err)
|
||||
h.discard(conn)
|
||||
return
|
||||
}
|
||||
|
||||
conn.SetReadDeadline(time.Time{})
|
||||
sc.SetReadDeadline(time.Time{})
|
||||
|
||||
h.logger = h.logger.WithFields(map[string]interface{}{
|
||||
"dst": addr.String(),
|
||||
})
|
||||
|
||||
h.logger.Infof("%s > %s", conn.RemoteAddr(), addr)
|
||||
|
||||
if h.bypass != nil && h.bypass.Contains(addr.String()) {
|
||||
h.logger.Info("bypass: ", addr.String())
|
||||
return
|
||||
@ -83,16 +96,21 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||
|
||||
cc, err := h.dial(ctx, addr.String())
|
||||
if err != nil {
|
||||
h.logger.Error(err)
|
||||
return
|
||||
}
|
||||
defer cc.Close()
|
||||
|
||||
handler.Transport(conn, cc)
|
||||
h.logger.Infof("%s <> %s", conn.RemoteAddr(), addr)
|
||||
handler.Transport(sc, cc)
|
||||
h.logger.Infof("%s >< %s", conn.RemoteAddr(), addr)
|
||||
}
|
||||
|
||||
func (h *ssHandler) discard(conn net.Conn) {
|
||||
io.Copy(ioutil.Discard, conn)
|
||||
}
|
||||
|
||||
func (h *ssHandler) parseMetadata(md md.Metadata) (err error) {
|
||||
h.md.cipher, err = h.initCipher(
|
||||
h.md.cipher, err = utils.ShadowCipher(
|
||||
md.GetString(method),
|
||||
md.GetString(password),
|
||||
md.GetString(key),
|
||||
@ -115,16 +133,14 @@ func (h *ssHandler) dial(ctx context.Context, addr string) (conn net.Conn, err e
|
||||
for i := 0; i < count; i++ {
|
||||
route := h.chain.GetRouteFor(addr)
|
||||
|
||||
/*
|
||||
if h.logger.IsLevelEnabled(logger.DebugLevel) {
|
||||
buf := bytes.Buffer{}
|
||||
fmt.Fprintf(&buf, "%s -> %s -> ",
|
||||
conn.RemoteAddr(), h.options.Node.String())
|
||||
for _, nd := range route.route {
|
||||
fmt.Fprintf(&buf, "%d@%s -> ", nd.ID, nd.String())
|
||||
for _, node := range route.Path() {
|
||||
fmt.Fprintf(&buf, "%s@%s > ", node.Name(), node.Addr())
|
||||
}
|
||||
fmt.Fprintf(&buf, "%s", host)
|
||||
log.Log("[route]", buf.String())
|
||||
*/
|
||||
fmt.Fprintf(&buf, "%s", addr)
|
||||
h.logger.Debugf("route(retry=%d): %s", i, buf.String())
|
||||
}
|
||||
|
||||
conn, err = route.Dial(ctx, "tcp", addr)
|
||||
if err == nil {
|
||||
@ -135,47 +151,3 @@ func (h *ssHandler) dial(ctx context.Context, addr string) (conn net.Conn, err e
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (h *ssHandler) initCipher(method, password string, key string) (core.Cipher, error) {
|
||||
if method == "" && password == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
c, _ := ss.NewCipher(method, password)
|
||||
if c != nil {
|
||||
return &shadowCipher{cipher: c}, nil
|
||||
}
|
||||
|
||||
return core.PickCipher(method, []byte(key), password)
|
||||
}
|
||||
|
||||
type shadowCipher struct {
|
||||
cipher *ss.Cipher
|
||||
}
|
||||
|
||||
func (c *shadowCipher) StreamConn(conn net.Conn) net.Conn {
|
||||
return ss.NewConn(conn, c.cipher.Copy())
|
||||
}
|
||||
|
||||
func (c *shadowCipher) PacketConn(conn net.PacketConn) net.PacketConn {
|
||||
return ss.NewSecurePacketConn(conn, c.cipher.Copy())
|
||||
}
|
||||
|
||||
// Due to in/out byte length is inconsistent of the shadowsocks.Conn.Write,
|
||||
// we wrap around it to make io.Copy happy.
|
||||
type shadowConn struct {
|
||||
net.Conn
|
||||
wbuf bytes.Buffer
|
||||
}
|
||||
|
||||
func (c *shadowConn) Write(b []byte) (n int, err error) {
|
||||
n = len(b) // force byte length consistent
|
||||
if c.wbuf.Len() > 0 {
|
||||
c.wbuf.Write(b) // append the data to the cached header
|
||||
_, err = c.Conn.Write(c.wbuf.Bytes())
|
||||
c.wbuf.Reset()
|
||||
return
|
||||
}
|
||||
_, err = c.Conn.Write(b)
|
||||
return
|
||||
}
|
@ -4,9 +4,9 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
@ -16,7 +16,7 @@ func init() {
|
||||
registry.RegisterHandler("ssu", NewHandler)
|
||||
}
|
||||
|
||||
type Handler struct {
|
||||
type ssuHandler struct {
|
||||
logger logger.Logger
|
||||
md metadata
|
||||
}
|
||||
@ -27,20 +27,20 @@ func NewHandler(opts ...handler.Option) handler.Handler {
|
||||
opt(options)
|
||||
}
|
||||
|
||||
return &Handler{
|
||||
return &ssuHandler{
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (h *Handler) Init(md md.Metadata) (err error) {
|
||||
func (h *ssuHandler) Init(md md.Metadata) (err error) {
|
||||
return h.parseMetadata(md)
|
||||
}
|
||||
|
||||
func (h *Handler) Handle(ctx context.Context, conn net.Conn) {
|
||||
func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn) {
|
||||
defer conn.Close()
|
||||
}
|
||||
|
||||
func (h *Handler) parseMetadata(md md.Metadata) (err error) {
|
||||
func (h *ssuHandler) parseMetadata(md md.Metadata) (err error) {
|
||||
h.md.cipher, err = h.initCipher(
|
||||
md.GetString(method),
|
||||
md.GetString(password),
|
||||
@ -55,7 +55,7 @@ func (h *Handler) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (h *Handler) initCipher(method, password string, key string) (core.Cipher, error) {
|
||||
func (h *ssuHandler) initCipher(method, password string, key string) (core.Cipher, error) {
|
||||
if method == "" && password == "" {
|
||||
return nil, nil
|
||||
}
|
100
pkg/internal/bufpool/pool.go
Normal file
100
pkg/internal/bufpool/pool.go
Normal file
@ -0,0 +1,100 @@
|
||||
package bufpool
|
||||
|
||||
import "sync"
|
||||
|
||||
var (
|
||||
smallBufferSize = 1 * 1024 // 1KB buffer
|
||||
mediumBufferSize = 8 * 1024 // 8KB buffer
|
||||
largeBufferSize = 64 * 1024 // 64KB buffer
|
||||
)
|
||||
|
||||
var (
|
||||
pools = []struct {
|
||||
size int
|
||||
pool sync.Pool
|
||||
}{
|
||||
{
|
||||
size: 128,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 128)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 512,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 512)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 1024,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 1024)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 4096,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 4096)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 8192,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 8192)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 16 * 1024,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 16*1024)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 32 * 1024,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 32*1024)
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
size: 64 * 1024,
|
||||
pool: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return make([]byte, 64*1024)
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// Get returns a buffer size range from (0, 64]KB,
|
||||
// panic if size > 64KB.
|
||||
func Get(size int) []byte {
|
||||
for i := range pools {
|
||||
if size <= pools[i].size {
|
||||
return pools[i].pool.Get().([]byte)
|
||||
}
|
||||
}
|
||||
panic("size too large (max=64KB)")
|
||||
}
|
||||
|
||||
func Put(b []byte) {
|
||||
for i := range pools {
|
||||
if len(b) == pools[i].size {
|
||||
pools[i].pool.Put(b)
|
||||
}
|
||||
}
|
||||
}
|
60
pkg/internal/utils/ss.go
Normal file
60
pkg/internal/utils/ss.go
Normal file
@ -0,0 +1,60 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net"
|
||||
|
||||
"github.com/shadowsocks/go-shadowsocks2/core"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
)
|
||||
|
||||
type shadowCipher struct {
|
||||
cipher *ss.Cipher
|
||||
}
|
||||
|
||||
func (c *shadowCipher) StreamConn(conn net.Conn) net.Conn {
|
||||
return ss.NewConn(conn, c.cipher.Copy())
|
||||
}
|
||||
|
||||
func (c *shadowCipher) PacketConn(conn net.PacketConn) net.PacketConn {
|
||||
return ss.NewSecurePacketConn(conn, c.cipher.Copy())
|
||||
}
|
||||
|
||||
func ShadowCipher(method, password string, key string) (core.Cipher, error) {
|
||||
if method == "" && password == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
c, _ := ss.NewCipher(method, password)
|
||||
if c != nil {
|
||||
return &shadowCipher{cipher: c}, nil
|
||||
}
|
||||
|
||||
return core.PickCipher(method, []byte(key), password)
|
||||
}
|
||||
|
||||
// Due to in/out byte length is inconsistent of the shadowsocks.Conn.Write,
|
||||
// we wrap around it to make io.Copy happy.
|
||||
type shadowConn struct {
|
||||
net.Conn
|
||||
wbuf *bytes.Buffer
|
||||
}
|
||||
|
||||
func ShadowConn(conn net.Conn, header []byte) net.Conn {
|
||||
return &shadowConn{
|
||||
Conn: conn,
|
||||
wbuf: bytes.NewBuffer(header),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *shadowConn) Write(b []byte) (n int, err error) {
|
||||
n = len(b) // force byte length consistent
|
||||
if c.wbuf.Len() > 0 {
|
||||
c.wbuf.Write(b) // append the data to the cached header
|
||||
_, err = c.Conn.Write(c.wbuf.Bytes())
|
||||
c.wbuf.Reset()
|
||||
return
|
||||
}
|
||||
_, err = c.Conn.Write(b)
|
||||
return
|
||||
}
|
@ -5,9 +5,9 @@ import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/xtaci/tcpraw"
|
||||
)
|
||||
@ -16,7 +16,7 @@ func init() {
|
||||
registry.RegisterListener("ftcp", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type ftcpListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
conn net.PacketConn
|
||||
@ -31,13 +31,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &ftcpListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *ftcpListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *ftcpListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -67,7 +67,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *ftcpListener) Close() error {
|
||||
err := l.conn.Close()
|
||||
l.connPool.Range(func(k interface{}, v *serverConn) bool {
|
||||
v.Close()
|
||||
@ -76,11 +76,11 @@ func (l *Listener) Close() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *ftcpListener) Addr() net.Addr {
|
||||
return l.conn.LocalAddr()
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *ftcpListener) listenLoop() {
|
||||
for {
|
||||
b := make([]byte, l.md.readBufferSize)
|
||||
|
||||
@ -119,7 +119,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *ftcpListener) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"golang.org/x/net/http2"
|
||||
)
|
||||
@ -19,7 +19,7 @@ func init() {
|
||||
registry.RegisterListener("h2", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type h2Listener struct {
|
||||
addr string
|
||||
net.Listener
|
||||
md metadata
|
||||
@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &h2Listener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *h2Listener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -71,7 +71,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *h2Listener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -83,7 +83,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *h2Listener) listenLoop() {
|
||||
for {
|
||||
conn, err := l.Listener.Accept()
|
||||
if err != nil {
|
||||
@ -96,7 +96,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) handleLoop(conn net.Conn) {
|
||||
func (l *h2Listener) handleLoop(conn net.Conn) {
|
||||
if l.md.tlsConfig != nil {
|
||||
tlsConn := tls.Server(conn, l.md.tlsConfig)
|
||||
// NOTE: HTTP2 server will check the TLS version,
|
||||
@ -114,7 +114,7 @@ func (l *Listener) handleLoop(conn net.Conn) {
|
||||
l.server.ServeConn(conn, &opt)
|
||||
}
|
||||
|
||||
func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
func (l *h2Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
/*
|
||||
log.Logf("[http2] %s -> %s %s %s %s",
|
||||
r.RemoteAddr, r.Host, r.Method, r.RequestURI, r.Proto)
|
||||
@ -140,7 +140,7 @@ func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
<-conn.closed // NOTE: we need to wait for streaming end, or the connection will be closed
|
||||
}
|
||||
|
||||
func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error) {
|
||||
func (l *h2Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error) {
|
||||
if l.md.path == "" && r.Method != http.MethodConnect {
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
return nil, errors.New("method not allowed")
|
||||
@ -172,7 +172,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) (*conn, error
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *h2Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
@ -5,10 +5,10 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"golang.org/x/net/http2"
|
||||
)
|
||||
@ -17,7 +17,7 @@ func init() {
|
||||
registry.RegisterListener("http2", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type http2Listener struct {
|
||||
saddr string
|
||||
md metadata
|
||||
server *http.Server
|
||||
@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &http2Listener{
|
||||
saddr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *http2Listener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -82,7 +82,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *http2Listener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -94,11 +94,11 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *http2Listener) Addr() net.Addr {
|
||||
return l.addr
|
||||
}
|
||||
|
||||
func (l *Listener) Close() (err error) {
|
||||
func (l *http2Listener) Close() (err error) {
|
||||
select {
|
||||
case <-l.errChan:
|
||||
default:
|
||||
@ -109,7 +109,7 @@ func (l *Listener) Close() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
func (l *http2Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
conn := &conn{
|
||||
r: r,
|
||||
w: w,
|
||||
@ -125,7 +125,7 @@ func (l *Listener) handleFunc(w http.ResponseWriter, r *http.Request) {
|
||||
<-conn.closed
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *http2Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
@ -4,10 +4,10 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/xtaci/kcp-go/v5"
|
||||
"github.com/xtaci/smux"
|
||||
@ -18,7 +18,7 @@ func init() {
|
||||
registry.RegisterListener("kcp", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type kcpListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
ln *kcp.Listener
|
||||
@ -32,13 +32,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &kcpListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *kcpListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -88,7 +88,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *kcpListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -100,15 +100,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *kcpListener) Close() error {
|
||||
return l.ln.Close()
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *kcpListener) Addr() net.Addr {
|
||||
return l.ln.Addr()
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *kcpListener) listenLoop() {
|
||||
for {
|
||||
conn, err := l.ln.AcceptKCP()
|
||||
if err != nil {
|
||||
@ -133,7 +133,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) mux(conn net.Conn) {
|
||||
func (l *kcpListener) mux(conn net.Conn) {
|
||||
defer conn.Close()
|
||||
|
||||
smuxConfig := smux.DefaultConfig()
|
||||
@ -169,6 +169,6 @@ func (l *Listener) mux(conn net.Conn) {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *kcpListener) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
@ -4,7 +4,7 @@ import (
|
||||
"errors"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/metadata"
|
||||
)
|
||||
|
||||
var (
|
@ -3,10 +3,10 @@ package http
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -14,7 +14,7 @@ func init() {
|
||||
registry.RegisterListener("obfs-http", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type obfsListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
net.Listener
|
||||
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &obfsListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *obfsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (net.Conn, error) {
|
||||
func (l *obfsListener) Accept() (net.Conn, error) {
|
||||
c, err := l.Listener.Accept()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) {
|
||||
return &conn{Conn: c}, nil
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *obfsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.keepAlive = md.GetBool(keepAlive)
|
||||
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)
|
||||
|
@ -3,10 +3,10 @@ package tls
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -14,7 +14,7 @@ func init() {
|
||||
registry.RegisterListener("obfs-tls", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type obfsListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
net.Listener
|
||||
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &obfsListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *obfsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -58,7 +58,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (net.Conn, error) {
|
||||
func (l *obfsListener) Accept() (net.Conn, error) {
|
||||
c, err := l.Listener.Accept()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -67,7 +67,7 @@ func (l *Listener) Accept() (net.Conn, error) {
|
||||
return &conn{Conn: c}, nil
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *obfsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.keepAlive = md.GetBool(keepAlive)
|
||||
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)
|
||||
|
@ -4,10 +4,10 @@ import (
|
||||
"context"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/lucas-clemente/quic-go"
|
||||
)
|
||||
@ -16,7 +16,7 @@ func init() {
|
||||
registry.RegisterListener("quic", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type quicListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
ln quic.Listener
|
||||
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &quicListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *quicListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -76,7 +76,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *quicListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -88,15 +88,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *quicListener) Close() error {
|
||||
return l.ln.Close()
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *quicListener) Addr() net.Addr {
|
||||
return l.ln.Addr()
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *quicListener) listenLoop() {
|
||||
for {
|
||||
ctx := context.Background()
|
||||
session, err := l.ln.Accept(ctx)
|
||||
@ -110,7 +110,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) mux(ctx context.Context, session quic.Session) {
|
||||
func (l *quicListener) mux(ctx context.Context, session quic.Session) {
|
||||
defer session.CloseWithError(0, "")
|
||||
|
||||
for {
|
||||
@ -132,7 +132,7 @@ func (l *Listener) mux(ctx context.Context, session quic.Session) {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *quicListener) parseMetadata(md md.Metadata) (err error) {
|
||||
|
||||
return
|
||||
}
|
@ -3,10 +3,10 @@ package tcp
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -14,7 +14,7 @@ func init() {
|
||||
registry.RegisterListener("tcp", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type tcpListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
net.Listener
|
||||
@ -26,13 +26,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &tcpListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *tcpListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *tcpListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.keepAlive = md.GetBool(keepAlive)
|
||||
l.md.keepAlivePeriod = md.GetDuration(keepAlivePeriod)
|
||||
|
@ -4,10 +4,10 @@ import (
|
||||
"crypto/tls"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -15,7 +15,7 @@ func init() {
|
||||
registry.RegisterListener("tls", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type tlsListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
net.Listener
|
||||
@ -27,13 +27,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &tlsListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *tlsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -55,7 +55,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *tlsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
@ -4,10 +4,10 @@ import (
|
||||
"crypto/tls"
|
||||
"net"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/xtaci/smux"
|
||||
)
|
||||
@ -16,7 +16,7 @@ func init() {
|
||||
registry.RegisterListener("mtls", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type mtlsListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
net.Listener
|
||||
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &mtlsListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *mtlsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -59,7 +59,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *mtlsListener) listenLoop() {
|
||||
for {
|
||||
conn, err := l.Listener.Accept()
|
||||
if err != nil {
|
||||
@ -71,7 +71,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) mux(conn net.Conn) {
|
||||
func (l *mtlsListener) mux(conn net.Conn) {
|
||||
smuxConfig := smux.DefaultConfig()
|
||||
smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled
|
||||
if l.md.muxKeepAlivePeriod > 0 {
|
||||
@ -114,7 +114,7 @@ func (l *Listener) mux(conn net.Conn) {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *mtlsListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -126,7 +126,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *mtlsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
@ -5,9 +5,9 @@ import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
)
|
||||
|
||||
@ -15,7 +15,7 @@ func init() {
|
||||
registry.RegisterListener("udp", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type udpListener struct {
|
||||
addr string
|
||||
md metadata
|
||||
conn net.PacketConn
|
||||
@ -30,13 +30,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &udpListener{
|
||||
addr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *udpListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -61,7 +61,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *udpListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -73,7 +73,7 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *udpListener) Close() error {
|
||||
err := l.conn.Close()
|
||||
l.connPool.Range(func(k interface{}, v *serverConn) bool {
|
||||
v.Close()
|
||||
@ -82,11 +82,11 @@ func (l *Listener) Close() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *udpListener) Addr() net.Addr {
|
||||
return l.conn.LocalAddr()
|
||||
}
|
||||
|
||||
func (l *Listener) listenLoop() {
|
||||
func (l *udpListener) listenLoop() {
|
||||
for {
|
||||
b := make([]byte, l.md.readBufferSize)
|
||||
|
||||
@ -125,7 +125,7 @@ func (l *Listener) listenLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *udpListener) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
@ -5,10 +5,10 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
@ -18,7 +18,7 @@ func init() {
|
||||
registry.RegisterListener("wss", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type wsListener struct {
|
||||
saddr string
|
||||
md metadata
|
||||
addr net.Addr
|
||||
@ -34,13 +34,13 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &wsListener{
|
||||
saddr: options.Addr,
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *wsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -94,7 +94,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *wsListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -106,15 +106,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *wsListener) Close() error {
|
||||
return l.srv.Close()
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *wsListener) Addr() net.Addr {
|
||||
return l.addr
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *wsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
||||
@ -127,7 +127,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) {
|
||||
func (l *wsListener) upgrade(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader)
|
||||
if err != nil {
|
||||
l.logger.Error(err)
|
@ -5,10 +5,10 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
md "github.com/go-gost/gost/pkg/components/metadata"
|
||||
"github.com/go-gost/gost/pkg/internal/utils"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
"github.com/go-gost/gost/pkg/logger"
|
||||
md "github.com/go-gost/gost/pkg/metadata"
|
||||
"github.com/go-gost/gost/pkg/registry"
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/xtaci/smux"
|
||||
@ -19,7 +19,7 @@ func init() {
|
||||
registry.RegisterListener("mwss", NewListener)
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
type mwsListener struct {
|
||||
saddr string
|
||||
md metadata
|
||||
addr net.Addr
|
||||
@ -35,12 +35,12 @@ func NewListener(opts ...listener.Option) listener.Listener {
|
||||
for _, opt := range opts {
|
||||
opt(options)
|
||||
}
|
||||
return &Listener{
|
||||
return &mwsListener{
|
||||
logger: options.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
func (l *mwsListener) Init(md md.Metadata) (err error) {
|
||||
if err = l.parseMetadata(md); err != nil {
|
||||
return
|
||||
}
|
||||
@ -90,7 +90,7 @@ func (l *Listener) Init(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
func (l *mwsListener) Accept() (conn net.Conn, err error) {
|
||||
var ok bool
|
||||
select {
|
||||
case conn = <-l.connChan:
|
||||
@ -102,15 +102,15 @@ func (l *Listener) Accept() (conn net.Conn, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) Close() error {
|
||||
func (l *mwsListener) Close() error {
|
||||
return l.srv.Close()
|
||||
}
|
||||
|
||||
func (l *Listener) Addr() net.Addr {
|
||||
func (l *mwsListener) Addr() net.Addr {
|
||||
return l.addr
|
||||
}
|
||||
|
||||
func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
func (l *mwsListener) parseMetadata(md md.Metadata) (err error) {
|
||||
l.md.tlsConfig, err = utils.LoadTLSConfig(
|
||||
md.GetString(certFile),
|
||||
md.GetString(keyFile),
|
||||
@ -123,7 +123,7 @@ func (l *Listener) parseMetadata(md md.Metadata) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) {
|
||||
func (l *mwsListener) upgrade(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := l.upgrader.Upgrade(w, r, l.md.responseHeader)
|
||||
if err != nil {
|
||||
l.logger.Error(err)
|
||||
@ -133,7 +133,7 @@ func (l *Listener) upgrade(w http.ResponseWriter, r *http.Request) {
|
||||
l.mux(utils.WebsocketServerConn(conn))
|
||||
}
|
||||
|
||||
func (l *Listener) mux(conn net.Conn) {
|
||||
func (l *mwsListener) mux(conn net.Conn) {
|
||||
smuxConfig := smux.DefaultConfig()
|
||||
smuxConfig.KeepAliveDisabled = l.md.muxKeepAliveDisabled
|
||||
if l.md.muxKeepAlivePeriod > 0 {
|
@ -1,10 +1,10 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
"github.com/go-gost/gost/pkg/components/dialer"
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
"github.com/go-gost/gost/pkg/connector"
|
||||
"github.com/go-gost/gost/pkg/dialer"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
)
|
||||
|
||||
type NewListener func(opts ...listener.Option) listener.Listener
|
||||
|
@ -5,8 +5,8 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-gost/gost/pkg/components/handler"
|
||||
"github.com/go-gost/gost/pkg/components/listener"
|
||||
"github.com/go-gost/gost/pkg/handler"
|
||||
"github.com/go-gost/gost/pkg/listener"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
|
Loading…
Reference in New Issue
Block a user