add tunnel/transport package
This commit is contained in:
parent
fc379f2d2c
commit
a894b4f354
@ -386,6 +386,13 @@ func (t *tun) Connect() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *tun) Init(opts ...Option) error {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(&t.options)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Dial an address
|
// Dial an address
|
||||||
func (t *tun) Dial(addr string) (Conn, error) {
|
func (t *tun) Dial(addr string) (Conn, error) {
|
||||||
c, ok := t.newSocket(addr, t.newSession())
|
c, ok := t.newSocket(addr, t.newSession())
|
||||||
|
30
tunnel/transport/listener.go
Normal file
30
tunnel/transport/listener.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package transport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/micro/go-micro/transport"
|
||||||
|
"github.com/micro/go-micro/tunnel"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tunListener struct {
|
||||||
|
l tunnel.Listener
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunListener) Addr() string {
|
||||||
|
return t.l.Addr()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunListener) Close() error {
|
||||||
|
return t.l.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunListener) Accept(fn func(socket transport.Socket)) error {
|
||||||
|
for {
|
||||||
|
// accept connection
|
||||||
|
c, err := t.l.Accept()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// execute the function
|
||||||
|
go fn(c)
|
||||||
|
}
|
||||||
|
}
|
113
tunnel/transport/transport.go
Normal file
113
tunnel/transport/transport.go
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
// Package transport provides a tunnel transport
|
||||||
|
package transport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/micro/go-micro/transport"
|
||||||
|
"github.com/micro/go-micro/tunnel"
|
||||||
|
)
|
||||||
|
|
||||||
|
type tunTransport struct {
|
||||||
|
options transport.Options
|
||||||
|
|
||||||
|
tunnel tunnel.Tunnel
|
||||||
|
}
|
||||||
|
|
||||||
|
type tunnelKey struct{}
|
||||||
|
|
||||||
|
type transportKey struct{}
|
||||||
|
|
||||||
|
func (t *tunTransport) Init(opts ...transport.Option) error {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(&t.options)
|
||||||
|
}
|
||||||
|
|
||||||
|
// close the existing tunnel
|
||||||
|
if t.tunnel != nil {
|
||||||
|
t.tunnel.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the tunnel
|
||||||
|
tun, ok := t.options.Context.Value(tunnelKey{}).(tunnel.Tunnel)
|
||||||
|
if !ok {
|
||||||
|
tun = tunnel.NewTunnel()
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the transport
|
||||||
|
tr, ok := t.options.Context.Value(transportKey{}).(transport.Transport)
|
||||||
|
if ok {
|
||||||
|
tun.Init(tunnel.Transport(tr))
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the tunnel
|
||||||
|
t.tunnel = tun
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunTransport) Dial(addr string, opts ...transport.DialOption) (transport.Client, error) {
|
||||||
|
if err := t.tunnel.Connect(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := t.tunnel.Dial(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunTransport) Listen(addr string, opts ...transport.ListenOption) (transport.Listener, error) {
|
||||||
|
if err := t.tunnel.Connect(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
l, err := t.tunnel.Listen(addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &tunListener{l}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunTransport) Options() transport.Options {
|
||||||
|
return t.options
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *tunTransport) String() string {
|
||||||
|
return "tunnel"
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewTransport honours the initialiser used in
|
||||||
|
func NewTransport(opts ...transport.Option) transport.Transport {
|
||||||
|
t := &tunTransport{
|
||||||
|
options: transport.Options{},
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialise
|
||||||
|
t.Init(opts...)
|
||||||
|
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithTransport sets the internal tunnel
|
||||||
|
func WithTunnel(t tunnel.Tunnel) transport.Option {
|
||||||
|
return func(o *transport.Options) {
|
||||||
|
if o.Context == nil {
|
||||||
|
o.Context = context.Background()
|
||||||
|
}
|
||||||
|
o.Context = context.WithValue(o.Context, tunnelKey{}, t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithTransport sets the internal transport
|
||||||
|
func WithTransport(t transport.Transport) transport.Option {
|
||||||
|
return func(o *transport.Options) {
|
||||||
|
if o.Context == nil {
|
||||||
|
o.Context = context.Background()
|
||||||
|
}
|
||||||
|
o.Context = context.WithValue(o.Context, transportKey{}, t)
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ import (
|
|||||||
// and Micro-Tunnel-Session header. The tunnel id is a hash of
|
// and Micro-Tunnel-Session header. The tunnel id is a hash of
|
||||||
// the address being requested.
|
// the address being requested.
|
||||||
type Tunnel interface {
|
type Tunnel interface {
|
||||||
|
Init(opts ...Option) error
|
||||||
// Connect connects the tunnel
|
// Connect connects the tunnel
|
||||||
Connect() error
|
Connect() error
|
||||||
// Close closes the tunnel
|
// Close closes the tunnel
|
||||||
|
Loading…
Reference in New Issue
Block a user