Rename dialers into network

This commit is contained in:
9seconds
2021-03-05 14:12:38 +03:00
parent 4689479745
commit d5147f1935
8 changed files with 60 additions and 69 deletions
+3 -3
View File
@@ -7,7 +7,7 @@ import (
"os" "os"
"time" "time"
"github.com/9seconds/mtg/v2/mtglib/dialers" "github.com/9seconds/mtg/v2/mtglib/network"
) )
var version = "dev" // has to be set by ldflags var version = "dev" // has to be set by ldflags
@@ -19,8 +19,8 @@ func main() {
fmt.Println(parseRawConfig(f)) fmt.Println(parseRawConfig(f))
bd, _ := dialers.NewDefaultBaseDialer(0, 0) bd, _ := network.NewDefaultDialer(0, 0)
d, _ := dialers.MakeDialer(bd, "9.9.9.9", 0) d, _ := network.NewNetwork(bd, "9.9.9.9", 0)
r, err := d.HTTP.Get("https://ifconfig.co") r, err := d.HTTP.Get("https://ifconfig.co")
-23
View File
@@ -1,23 +0,0 @@
package dialers
import (
"fmt"
"net/url"
"time"
"golang.org/x/net/proxy"
)
func NewSocks5BaseDialer(proxyUrl *url.URL, timeout time.Duration, bufferSize int) (BaseDialer, error) {
baseDialer, err := NewDefaultBaseDialer(timeout, bufferSize)
if err != nil {
return nil, fmt.Errorf("cannot initialize base dialer: %w", err)
}
rv, err := proxy.FromURL(proxyUrl, baseDialer.(*defaultBaseDialer))
if err != nil {
return nil, fmt.Errorf("cannot initialize socks5 proxy dialer: %w", err)
}
return rv.(BaseDialer), nil
}
@@ -1,4 +1,4 @@
package dialers package network
import "time" import "time"
@@ -1,4 +1,4 @@
package dialers package network
import ( import (
"context" "context"
@@ -9,17 +9,17 @@ import (
"github.com/libp2p/go-reuseport" "github.com/libp2p/go-reuseport"
) )
type defaultBaseDialer struct { type defaultDialer struct {
net.Dialer net.Dialer
bufferSize int bufferSize int
} }
func (d *defaultBaseDialer) Dial(network, address string) (net.Conn, error) { func (d *defaultDialer) Dial(network, address string) (net.Conn, error) {
return d.DialContext(context.Background(), network, address) return d.DialContext(context.Background(), network, address)
} }
func (d *defaultBaseDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { func (d *defaultDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
switch network { switch network {
case "tcp", "tcp4", "tcp6": case "tcp", "tcp4", "tcp6":
default: default:
@@ -56,7 +56,7 @@ func (d *defaultBaseDialer) DialContext(ctx context.Context, network, address st
return tcpConn, nil return tcpConn, nil
} }
func NewDefaultBaseDialer(timeout time.Duration, bufferSize int) (BaseDialer, error) { func NewDefaultDialer(timeout time.Duration, bufferSize int) (Dialer, error) {
switch { switch {
case timeout < 0: case timeout < 0:
return nil, fmt.Errorf("timeout %v should be positive number", timeout) return nil, fmt.Errorf("timeout %v should be positive number", timeout)
@@ -72,7 +72,7 @@ func NewDefaultBaseDialer(timeout time.Duration, bufferSize int) (BaseDialer, er
bufferSize = DefaultBufferSize bufferSize = DefaultBufferSize
} }
return &defaultBaseDialer{ return &defaultDialer{
Dialer: net.Dialer{ Dialer: net.Dialer{
Timeout: timeout, Timeout: timeout,
Control: reuseport.Control, Control: reuseport.Control,
@@ -1,11 +1,10 @@
package dialers package network
import ( import (
"context" "context"
"net" "net"
) )
type BaseDialer interface { type Dialer interface {
Dial(network, address string) (net.Conn, error)
DialContext(ctx context.Context, network, address string) (net.Conn, error) DialContext(ctx context.Context, network, address string) (net.Conn, error)
} }
@@ -1,4 +1,4 @@
package dialers package network
import ( import (
"context" "context"
@@ -11,18 +11,18 @@ import (
doh "github.com/babolivier/go-doh-client" doh "github.com/babolivier/go-doh-client"
) )
type Dialer struct { type Network struct {
HTTP http.Client HTTP http.Client
DNS doh.Resolver DNS doh.Resolver
baseDialer BaseDialer dialer Dialer
} }
func (d *Dialer) Dial(network, address string) (net.Conn, error) { func (d *Network) Dial(network, address string) (net.Conn, error) {
return d.DialContext(context.Background(), network, address) return d.DialContext(context.Background(), network, address)
} }
func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { func (d *Network) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
host, port, _ := net.SplitHostPort(address) host, port, _ := net.SplitHostPort(address)
ips, err := d.resolveIPs(network, host) ips, err := d.resolveIPs(network, host)
@@ -35,7 +35,7 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.
}) })
for _, v := range ips { for _, v := range ips {
if conn, err := d.baseDialer.DialContext(ctx, network, net.JoinHostPort(v, port)); err == nil { if conn, err := d.dialer.DialContext(ctx, network, net.JoinHostPort(v, port)); err == nil {
return conn, nil return conn, nil
} }
} }
@@ -43,7 +43,7 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.
return nil, fmt.Errorf("cannot dial to %s:%s", network, address) return nil, fmt.Errorf("cannot dial to %s:%s", network, address)
} }
func (d *Dialer) resolveIPs(network, address string) ([]string, error) { func (d *Network) resolveIPs(network, address string) ([]string, error) {
if net.ParseIP(address) != nil { if net.ParseIP(address) != nil {
return []string{address}, nil return []string{address}, nil
} }
@@ -75,7 +75,7 @@ func (d *Dialer) resolveIPs(network, address string) ([]string, error) {
return ips, nil return ips, nil
} }
func MakeDialer(base BaseDialer, dohHostname string, httpTimeout time.Duration) (*Dialer, error) { func NewNetwork(dialer Dialer, dohHostname string, httpTimeout time.Duration) (*Network, error) {
switch { switch {
case httpTimeout < 0: case httpTimeout < 0:
return nil, fmt.Errorf("timeout should be positive number %v", httpTimeout) return nil, fmt.Errorf("timeout should be positive number %v", httpTimeout)
@@ -90,23 +90,23 @@ func MakeDialer(base BaseDialer, dohHostname string, httpTimeout time.Duration)
dohHTTPClient := &http.Client{ dohHTTPClient := &http.Client{
Timeout: httpTimeout, Timeout: httpTimeout,
Transport: &http.Transport{ Transport: &http.Transport{
DialContext: base.DialContext, DialContext: dialer.DialContext,
}, },
} }
rv := &Dialer{ network := &Network{
baseDialer: base, dialer: dialer,
DNS: doh.Resolver{ DNS: doh.Resolver{
Host: dohHostname, Host: dohHostname,
Class: doh.IN, Class: doh.IN,
HTTPClient: dohHTTPClient, HTTPClient: dohHTTPClient,
}, },
} }
rv.HTTP = http.Client{ network.HTTP = http.Client{
Timeout: httpTimeout, Timeout: httpTimeout,
Transport: &http.Transport{ Transport: &http.Transport{
DialContext: rv.DialContext, DialContext: network.DialContext,
}, },
} }
return rv, nil return network, nil
} }
@@ -1,4 +1,4 @@
package dialers package network
import ( import (
"context" "context"
@@ -12,23 +12,15 @@ import (
shadowsocks "github.com/shadowsocks/go-shadowsocks2/core" shadowsocks "github.com/shadowsocks/go-shadowsocks2/core"
) )
type shadowsocksBaseDialer struct { type shadowsocksDialer struct {
base BaseDialer Dialer
cipher shadowsocks.StreamConnCipher cipher shadowsocks.StreamConnCipher
} }
func (s *shadowsocksBaseDialer) Dial(network, address string) (net.Conn, error) { func (s *shadowsocksDialer) DialContext(ctx context.Context,
conn, err := s.base.Dial(network, address)
if err != nil {
return nil, err
}
return s.cipher.StreamConn(conn), nil
}
func (s *shadowsocksBaseDialer) DialContext(ctx context.Context,
network, address string) (net.Conn, error) { network, address string) (net.Conn, error) {
conn, err := s.base.DialContext(ctx, network, address) conn, err := s.Dialer.DialContext(ctx, network, address)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -36,8 +28,8 @@ func (s *shadowsocksBaseDialer) DialContext(ctx context.Context,
return s.cipher.StreamConn(conn), nil return s.cipher.StreamConn(conn), nil
} }
func NewShadowsocksBaseDialer(proxyUrl *url.URL, func NewShadowsocksDialer(proxyUrl *url.URL,
timeout time.Duration, bufferSize int) (BaseDialer, error) { timeout time.Duration, bufferSize int) (Dialer, error) {
username := proxyUrl.User.Username() username := proxyUrl.User.Username()
decoded, err := base64.RawURLEncoding.DecodeString(username) decoded, err := base64.RawURLEncoding.DecodeString(username)
@@ -55,14 +47,14 @@ func NewShadowsocksBaseDialer(proxyUrl *url.URL,
return nil, fmt.Errorf("cannot initialize shadowsocks cipher: %w", err) return nil, fmt.Errorf("cannot initialize shadowsocks cipher: %w", err)
} }
baseDialer, err := NewDefaultBaseDialer(timeout, bufferSize) dialer, err := NewDefaultDialer(timeout, bufferSize)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot initialize a base dialer: %w", err) return nil, fmt.Errorf("cannot initialize a base dialer: %w", err)
} }
return &shadowsocksBaseDialer{ return &shadowsocksDialer{
base: baseDialer, Dialer: dialer,
cipher: cipher, cipher: cipher,
}, nil }, nil
} }
+23
View File
@@ -0,0 +1,23 @@
package network
import (
"fmt"
"net/url"
"time"
"golang.org/x/net/proxy"
)
func NewSocks5Dialer(proxyUrl *url.URL, timeout time.Duration, bufferSize int) (Dialer, error) {
dialer, err := NewDefaultDialer(timeout, bufferSize)
if err != nil {
return nil, fmt.Errorf("cannot initialize base dialer: %w", err)
}
rv, err := proxy.FromURL(proxyUrl, dialer.(*defaultDialer))
if err != nil {
return nil, fmt.Errorf("cannot initialize socks5 proxy dialer: %w", err)
}
return rv.(Dialer), nil
}