mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-26 16:57:08 +00:00
chore: add DialerForAPI to outbound option for library user
This commit is contained in:
37
component/proxydialer/byname.go
Normal file
37
component/proxydialer/byname.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package proxydialer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
|
||||
C "github.com/metacubex/mihomo/constant"
|
||||
"github.com/metacubex/mihomo/tunnel"
|
||||
)
|
||||
|
||||
type byNameProxyDialer struct {
|
||||
proxyName string
|
||||
}
|
||||
|
||||
func (d byNameProxyDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
proxies := tunnel.Proxies()
|
||||
proxy, ok := proxies[d.proxyName]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("proxyName[%s] not found", d.proxyName)
|
||||
}
|
||||
return New(proxy, true).DialContext(ctx, network, address)
|
||||
}
|
||||
|
||||
func (d byNameProxyDialer) ListenPacket(ctx context.Context, network, address string, rAddrPort netip.AddrPort) (net.PacketConn, error) {
|
||||
proxies := tunnel.Proxies()
|
||||
proxy, ok := proxies[d.proxyName]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("proxyName[%s] not found", d.proxyName)
|
||||
}
|
||||
return New(proxy, true).ListenPacket(ctx, network, address, rAddrPort)
|
||||
}
|
||||
|
||||
func NewByName(proxyName string) C.Dialer {
|
||||
return byNameProxyDialer{proxyName: proxyName}
|
||||
}
|
||||
@@ -2,33 +2,22 @@ package proxydialer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
"strings"
|
||||
|
||||
N "github.com/metacubex/mihomo/common/net"
|
||||
C "github.com/metacubex/mihomo/constant"
|
||||
"github.com/metacubex/mihomo/tunnel"
|
||||
"github.com/metacubex/mihomo/tunnel/statistic"
|
||||
)
|
||||
|
||||
type proxyDialer struct {
|
||||
proxy C.ProxyAdapter
|
||||
dialer C.Dialer
|
||||
statistic bool
|
||||
}
|
||||
|
||||
func New(proxy C.ProxyAdapter, dialer C.Dialer, statistic bool) C.Dialer {
|
||||
return proxyDialer{proxy: proxy, dialer: dialer, statistic: statistic}
|
||||
}
|
||||
|
||||
func NewByName(proxyName string, dialer C.Dialer) (C.Dialer, error) {
|
||||
proxies := tunnel.Proxies()
|
||||
if proxy, ok := proxies[proxyName]; ok {
|
||||
return New(proxy, dialer, true), nil
|
||||
}
|
||||
return nil, fmt.Errorf("proxyName[%s] not found", proxyName)
|
||||
func New(proxy C.ProxyAdapter, statistic bool) C.Dialer {
|
||||
return proxyDialer{proxy: proxy, statistic: statistic}
|
||||
}
|
||||
|
||||
func (p proxyDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
|
||||
@@ -12,71 +12,22 @@ import (
|
||||
|
||||
type SingDialer interface {
|
||||
N.Dialer
|
||||
SetDialer(dialer C.Dialer)
|
||||
}
|
||||
|
||||
type singDialer proxyDialer
|
||||
type singDialer struct {
|
||||
cDialer C.Dialer
|
||||
}
|
||||
|
||||
var _ N.Dialer = (*singDialer)(nil)
|
||||
|
||||
func (d *singDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
|
||||
return (*proxyDialer)(d).DialContext(ctx, network, destination.String())
|
||||
func (d singDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
|
||||
return d.cDialer.DialContext(ctx, network, destination.String())
|
||||
}
|
||||
|
||||
func (d *singDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
|
||||
return (*proxyDialer)(d).ListenPacket(ctx, "udp", "", destination.AddrPort())
|
||||
func (d singDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
|
||||
return d.cDialer.ListenPacket(ctx, "udp", "", destination.AddrPort())
|
||||
}
|
||||
|
||||
func (d *singDialer) SetDialer(dialer C.Dialer) {
|
||||
(*proxyDialer)(d).dialer = dialer
|
||||
}
|
||||
|
||||
func NewSingDialer(proxy C.ProxyAdapter, dialer C.Dialer, statistic bool) SingDialer {
|
||||
return (*singDialer)(&proxyDialer{
|
||||
proxy: proxy,
|
||||
dialer: dialer,
|
||||
statistic: statistic,
|
||||
})
|
||||
}
|
||||
|
||||
type byNameSingDialer struct {
|
||||
dialer C.Dialer
|
||||
proxyName string
|
||||
}
|
||||
|
||||
var _ N.Dialer = (*byNameSingDialer)(nil)
|
||||
|
||||
func (d *byNameSingDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
|
||||
var cDialer C.Dialer = d.dialer
|
||||
if len(d.proxyName) > 0 {
|
||||
pd, err := NewByName(d.proxyName, d.dialer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cDialer = pd
|
||||
}
|
||||
return cDialer.DialContext(ctx, network, destination.String())
|
||||
}
|
||||
|
||||
func (d *byNameSingDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
|
||||
var cDialer C.Dialer = d.dialer
|
||||
if len(d.proxyName) > 0 {
|
||||
pd, err := NewByName(d.proxyName, d.dialer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cDialer = pd
|
||||
}
|
||||
return cDialer.ListenPacket(ctx, "udp", "", destination.AddrPort())
|
||||
}
|
||||
|
||||
func (d *byNameSingDialer) SetDialer(dialer C.Dialer) {
|
||||
d.dialer = dialer
|
||||
}
|
||||
|
||||
func NewByNameSingDialer(proxyName string, dialer C.Dialer) SingDialer {
|
||||
return &byNameSingDialer{
|
||||
dialer: dialer,
|
||||
proxyName: proxyName,
|
||||
}
|
||||
func NewSingDialer(cDialer C.Dialer) SingDialer {
|
||||
return singDialer{cDialer: cDialer}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user