add new interfaces
This commit is contained in:
parent
791bd63dd5
commit
eb99d97f71
4
chain.go
4
chain.go
@ -556,3 +556,7 @@ func (c *ProxyChain) getQuicConn(header http.Header) (net.Conn, error) {
|
|||||||
conn.remoteAddr, _ = net.ResolveUDPAddr("udp", quicNode.Addr)
|
conn.remoteAddr, _ = net.ResolveUDPAddr("udp", quicNode.Addr)
|
||||||
return conn, nil
|
return conn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Chain struct {
|
||||||
|
nodes []Node
|
||||||
|
}
|
||||||
|
10
client.go
Normal file
10
client.go
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package gost
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
// Client represents a node client
|
||||||
|
type Client interface {
|
||||||
|
Connect() (net.Conn, error)
|
||||||
|
Handshake(conn net.Conn) (net.Conn, error)
|
||||||
|
Dial(conn net.Conn, addr string) (net.Conn, error)
|
||||||
|
}
|
8
node.go
8
node.go
@ -211,3 +211,11 @@ func (node *ProxyNode) keyFile() string {
|
|||||||
func (node ProxyNode) String() string {
|
func (node ProxyNode) String() string {
|
||||||
return fmt.Sprintf("transport: %s, protocol: %s, addr: %s, whitelist: %v, blacklist: %v", node.Transport, node.Protocol, node.Addr, node.Whitelist, node.Blacklist)
|
return fmt.Sprintf("transport: %s, protocol: %s, addr: %s, whitelist: %v, blacklist: %v", node.Transport, node.Protocol, node.Addr, node.Whitelist, node.Blacklist)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Node represents a proxy node
|
||||||
|
type Node interface {
|
||||||
|
Init(opts ...Option) error
|
||||||
|
Client() Client
|
||||||
|
Server() Server
|
||||||
|
Options() Options
|
||||||
|
}
|
||||||
|
77
options.go
Normal file
77
options.go
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package gost
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Options holds options of node
|
||||||
|
type Options interface {
|
||||||
|
Get(opt string) (v interface{})
|
||||||
|
Set(opt string, v interface{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type Option func(Options)
|
||||||
|
|
||||||
|
type DefaultOptions struct {
|
||||||
|
Addr string `opt:"addr"` // [host]:port
|
||||||
|
Protocol string `opt:"protocol"` // protocol: http/socks5/ss
|
||||||
|
Transport string `opt:"transport"` // transport: ws/wss/tls/http2/tcp/udp/rtcp/rudp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *DefaultOptions) Get(opt string) interface{} {
|
||||||
|
return GetOption(o, opt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *DefaultOptions) Set(opt string, v interface{}) {
|
||||||
|
SetOption(o, opt, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddrOption(a string) Option {
|
||||||
|
return func(opts Options) {
|
||||||
|
SetOption(opts, "addr", a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProtocolOption(p string) Option {
|
||||||
|
return func(opts Options) {
|
||||||
|
SetOption(opts, "protocol", p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TransportOption(t string) Option {
|
||||||
|
return func(opts Options) {
|
||||||
|
SetOption(opts, "transport", t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOption(i interface{}, opt string) interface{} {
|
||||||
|
ps := reflect.ValueOf(i)
|
||||||
|
if ps.Kind() != reflect.Ptr && ps.Kind() != reflect.Interface {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
s := ps.Elem()
|
||||||
|
for n := 0; n < s.NumField(); n++ {
|
||||||
|
log.Println("tag:", s.Type().Field(n).Tag.Get("opt"))
|
||||||
|
if opt == s.Type().Field(n).Tag.Get("opt") && s.Field(n).CanInterface() {
|
||||||
|
// return s.Field(n).Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetOption(i interface{}, opt string, v interface{}) {
|
||||||
|
ps := reflect.ValueOf(i)
|
||||||
|
if ps.Kind() != reflect.Ptr || ps.Kind() != reflect.Interface {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s := ps.Elem()
|
||||||
|
|
||||||
|
for n := 0; n < s.NumField(); n++ {
|
||||||
|
if opt == s.Type().Field(n).Tag.Get("opt") &&
|
||||||
|
s.Field(n).IsValid() && s.Field(n).CanSet() {
|
||||||
|
s.Field(n).Set(reflect.ValueOf(v))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -295,3 +295,8 @@ func (_ *ProxyServer) transport(conn1, conn2 net.Conn) (err error) {
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Server represents a node server
|
||||||
|
type Server interface {
|
||||||
|
Run() error
|
||||||
|
}
|
||||||
|
18
tcp/client.go
Normal file
18
tcp/client.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package tcp
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
type nodeClient struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *nodeClient) Connect() (net.Conn, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *nodeClient) Handshake(conn net.Conn) (net.Conn, error) {
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *nodeClient) Dial(conn net.Conn, addr string) (net.Conn, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
43
tcp/node.go
Normal file
43
tcp/node.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package tcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ginuerzh/gost"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tcpNode struct {
|
||||||
|
options *tcpNodeOptions
|
||||||
|
client *nodeClient
|
||||||
|
server *nodeServer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNode creates a tcpNode with options
|
||||||
|
func NewNode(opts ...gost.Option) gost.Node {
|
||||||
|
node := &tcpNode{
|
||||||
|
options: new(tcpNodeOptions),
|
||||||
|
}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(node.options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
func (node *tcpNode) Init(opts ...gost.Option) error {
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(node.options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (node *tcpNode) Client() gost.Client {
|
||||||
|
return node.client
|
||||||
|
}
|
||||||
|
|
||||||
|
func (node *tcpNode) Server() gost.Server {
|
||||||
|
return node.server
|
||||||
|
}
|
||||||
|
|
||||||
|
func (node *tcpNode) Options() gost.Options {
|
||||||
|
return node.options
|
||||||
|
}
|
26
tcp/options.go
Normal file
26
tcp/options.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package tcp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
|
||||||
|
"github.com/ginuerzh/gost"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tcpNodeOptions struct {
|
||||||
|
*gost.DefaultOptions
|
||||||
|
Users []url.Userinfo `opt:"users"` // authentication for proxy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *tcpNodeOptions) Get(opt string) interface{} {
|
||||||
|
return gost.GetOption(o, opt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *tcpNodeOptions) Set(opt string, v interface{}) {
|
||||||
|
gost.SetOption(o, opt, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UsersOption(users ...url.Userinfo) gost.Option {
|
||||||
|
return func(opts gost.Options) {
|
||||||
|
gost.SetOption(opts, "users", users)
|
||||||
|
}
|
||||||
|
}
|
31
tcp/options_test.go
Normal file
31
tcp/options_test.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package tcp
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
import "net/url"
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
var tests = []struct {
|
||||||
|
Opt string
|
||||||
|
Value interface{}
|
||||||
|
}{
|
||||||
|
{"addr", "localhost:8080"},
|
||||||
|
{"protocol", "http"},
|
||||||
|
{"transport", "tcp"},
|
||||||
|
{"users", []url.Userinfo{*url.UserPassword("admin", "123456")}},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOptions(t *testing.T) {
|
||||||
|
opts := new(tcpNodeOptions)
|
||||||
|
for _, test := range tests {
|
||||||
|
opts.Set(test.Opt, test.Value)
|
||||||
|
v := opts.Get(test.Opt)
|
||||||
|
if !reflect.DeepEqual(v, test.Value) {
|
||||||
|
t.Log("not equal:", test.Opt, v)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.Log("addr:", opts.Addr)
|
||||||
|
t.Log("protocol:", opts.Protocol)
|
||||||
|
t.Log("transport:", opts.Transport)
|
||||||
|
t.Log("users:", opts.Users)
|
||||||
|
}
|
8
tcp/server.go
Normal file
8
tcp/server.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package tcp
|
||||||
|
|
||||||
|
type nodeServer struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *nodeServer) Run() error {
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user