improve ss

This commit is contained in:
ginuerzh 2021-11-01 21:57:28 +08:00
parent e2995ece96
commit ec8615991b
71 changed files with 554 additions and 316 deletions

View File

@ -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"
)

View File

@ -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

View File

@ -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"
)

View File

@ -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()...)

View File

@ -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 {

View File

@ -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
}

View File

@ -1,11 +0,0 @@
package ss
const (
method = "method"
password = "password"
)
type metadata struct {
method string
password string
}

View File

@ -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.

View File

@ -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()

View 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
}

View 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
}

View File

@ -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.

View File

@ -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"
)

View File

@ -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 {

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View 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
View 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
}

View File

@ -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
}

View File

@ -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),

View File

@ -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),

View File

@ -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
}

View File

@ -4,7 +4,7 @@ import (
"errors"
"net"
"github.com/go-gost/gost/pkg/components/metadata"
"github.com/go-gost/gost/pkg/metadata"
)
var (

View File

@ -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)

View File

@ -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)

View File

@ -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
}

View File

@ -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)

View File

@ -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),

View File

@ -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),

View File

@ -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
}

View File

@ -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)

View File

@ -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 {

View File

@ -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

View File

@ -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 {