add reload and plugin support for hop

This commit is contained in:
ginuerzh
2023-09-28 21:04:15 +08:00
parent ddc3c9392e
commit ea585fc25d
88 changed files with 2208 additions and 1538 deletions

View File

@ -11,10 +11,11 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/common/bufpool"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/hosts"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
xchain "github.com/go-gost/x/chain"
xhop "github.com/go-gost/x/hop"
resolver_util "github.com/go-gost/x/internal/util/resolver"
"github.com/go-gost/x/registry"
"github.com/go-gost/x/resolver/exchanger"
@ -30,7 +31,7 @@ func init() {
}
type dnsHandler struct {
hop chain.Hop
hop hop.Hop
exchangers map[string]exchanger.Exchanger
cache *resolver_util.Cache
router *chain.Router
@ -70,10 +71,14 @@ func (h *dnsHandler) Init(md md.Metadata) (err error) {
for i, addr := range h.md.dns {
nodes = append(nodes, chain.NewNode(fmt.Sprintf("target-%d", i), addr))
}
h.hop = xchain.NewChainHop(nodes)
h.hop = xhop.NewHop(xhop.NodeOption(nodes...))
}
for _, node := range h.hop.Nodes() {
var nodes []*chain.Node
if nl, ok := h.hop.(hop.NodeList); ok {
nodes = nl.Nodes()
}
for _, node := range nodes {
addr := strings.TrimSpace(node.Addr)
if addr == "" {
continue
@ -109,7 +114,7 @@ func (h *dnsHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *dnsHandler) Forward(hop chain.Hop) {
func (h *dnsHandler) Forward(hop hop.Hop) {
h.hop = hop
}
@ -325,7 +330,7 @@ func (h *dnsHandler) selectExchanger(ctx context.Context, addr string) exchanger
if h.hop == nil {
return nil
}
node := h.hop.Select(ctx, chain.AddrSelectOption(addr))
node := h.hop.Select(ctx, hop.AddrSelectOption(addr))
if node == nil {
return nil
}

View File

@ -15,6 +15,7 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
xnet "github.com/go-gost/x/internal/net"
@ -30,7 +31,7 @@ func init() {
}
type forwardHandler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -61,7 +62,7 @@ func (h *forwardHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *forwardHandler) Forward(hop chain.Hop) {
func (h *forwardHandler) Forward(hop hop.Hop) {
h.hop = hop
}
@ -123,8 +124,8 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand
}
if h.hop != nil {
target = h.hop.Select(ctx,
chain.HostSelectOption(host),
chain.ProtocolSelectOption(protocol),
hop.HostSelectOption(host),
hop.ProtocolSelectOption(protocol),
)
}
if target == nil {
@ -192,8 +193,8 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, log l
}
if h.hop != nil {
target = h.hop.Select(ctx,
chain.HostSelectOption(req.Host),
chain.ProtocolSelectOption(forward.ProtoHTTP),
hop.HostSelectOption(req.Host),
hop.ProtocolSelectOption(forward.ProtoHTTP),
)
}
if target == nil {

View File

@ -15,6 +15,7 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/logger"
mdata "github.com/go-gost/core/metadata"
mdutil "github.com/go-gost/core/metadata/util"
@ -30,7 +31,7 @@ func init() {
}
type forwardHandler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -61,7 +62,7 @@ func (h *forwardHandler) Init(md mdata.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *forwardHandler) Forward(hop chain.Hop) {
func (h *forwardHandler) Forward(hop hop.Hop) {
h.hop = hop
}
@ -123,8 +124,8 @@ func (h *forwardHandler) Handle(ctx context.Context, conn net.Conn, opts ...hand
}
if h.hop != nil {
target = h.hop.Select(ctx,
chain.HostSelectOption(host),
chain.ProtocolSelectOption(protocol),
hop.HostSelectOption(host),
hop.ProtocolSelectOption(protocol),
)
}
if target == nil {
@ -189,8 +190,8 @@ func (h *forwardHandler) handleHTTP(ctx context.Context, rw io.ReadWriter, log l
}
if h.hop != nil {
target = h.hop.Select(ctx,
chain.HostSelectOption(req.Host),
chain.ProtocolSelectOption(forward.ProtoHTTP),
hop.HostSelectOption(req.Host),
hop.ProtocolSelectOption(forward.ProtoHTTP),
)
}
if target == nil {

View File

@ -10,6 +10,7 @@ import (
"time"
"github.com/go-gost/core/chain"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
@ -22,7 +23,7 @@ func init() {
}
type http3Handler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -53,7 +54,7 @@ func (h *http3Handler) Init(md md.Metadata) error {
}
// Forward implements handler.Forwarder.
func (h *http3Handler) Forward(hop chain.Hop) {
func (h *http3Handler) Forward(hop hop.Hop) {
h.hop = hop
}
@ -118,7 +119,7 @@ func (h *http3Handler) roundTrip(ctx context.Context, w http.ResponseWriter, req
var target *chain.Node
if h.hop != nil {
target = h.hop.Select(ctx, chain.HostSelectOption(addr))
target = h.hop.Select(ctx, hop.HostSelectOption(addr))
}
if target == nil {
err := errors.New("target not available")

View File

@ -10,6 +10,7 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/listener"
md "github.com/go-gost/core/metadata"
"github.com/go-gost/core/service"
@ -32,7 +33,7 @@ func init() {
}
type relayHandler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -124,7 +125,7 @@ func (h *relayHandler) initEntryPoint() (err error) {
}
// Forward implements handler.Forwarder.
func (h *relayHandler) Forward(hop chain.Hop) {
func (h *relayHandler) Forward(hop hop.Hop) {
h.hop = hop
}

View File

@ -9,6 +9,7 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
"github.com/go-gost/core/recorder"
@ -24,7 +25,7 @@ func init() {
}
type serialHandler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -64,7 +65,7 @@ func (h *serialHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *serialHandler) Forward(hop chain.Hop) {
func (h *serialHandler) Forward(hop hop.Hop) {
h.hop = hop
}

View File

@ -13,6 +13,7 @@ import (
"github.com/go-gost/core/chain"
"github.com/go-gost/core/common/bufpool"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
"github.com/go-gost/x/internal/util/ss"
@ -28,7 +29,7 @@ func init() {
}
type tapHandler struct {
hop chain.Hop
hop hop.Hop
routes sync.Map
exit chan struct{}
cipher core.Cipher
@ -72,7 +73,7 @@ func (h *tapHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *tapHandler) Forward(hop chain.Hop) {
func (h *tapHandler) Forward(hop hop.Hop) {
h.hop = hop
}

View File

@ -9,6 +9,7 @@ import (
"time"
"github.com/go-gost/core/chain"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata"
tun_util "github.com/go-gost/x/internal/util/tun"
@ -26,7 +27,7 @@ func init() {
}
type tunHandler struct {
hop chain.Hop
hop hop.Hop
routes sync.Map
router *chain.Router
md metadata
@ -58,7 +59,7 @@ func (h *tunHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *tunHandler) Forward(hop chain.Hop) {
func (h *tunHandler) Forward(hop hop.Hop) {
h.hop = hop
}

View File

@ -8,6 +8,7 @@ import (
"time"
"github.com/go-gost/core/chain"
"github.com/go-gost/core/hop"
"github.com/go-gost/core/handler"
"github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata"
@ -20,7 +21,7 @@ func init() {
}
type unixHandler struct {
hop chain.Hop
hop hop.Hop
router *chain.Router
md metadata
options handler.Options
@ -51,7 +52,7 @@ func (h *unixHandler) Init(md md.Metadata) (err error) {
}
// Forward implements handler.Forwarder.
func (h *unixHandler) Forward(hop chain.Hop) {
func (h *unixHandler) Forward(hop hop.Hop) {
h.hop = hop
}