Update hysteria2 realm
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
@@ -18,11 +19,13 @@ import (
|
||||
qtls "github.com/sagernet/sing-quic"
|
||||
"github.com/sagernet/sing-quic/hysteria"
|
||||
"github.com/sagernet/sing-quic/hysteria2"
|
||||
"github.com/sagernet/sing-quic/hysteria2/realm"
|
||||
"github.com/sagernet/sing/common"
|
||||
"github.com/sagernet/sing/common/auth"
|
||||
E "github.com/sagernet/sing/common/exceptions"
|
||||
M "github.com/sagernet/sing/common/metadata"
|
||||
N "github.com/sagernet/sing/common/network"
|
||||
"github.com/sagernet/sing/service"
|
||||
)
|
||||
|
||||
func RegisterInbound(registry *inbound.Registry) {
|
||||
@@ -114,9 +117,35 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo
|
||||
} else {
|
||||
udpTimeout = C.UDPTimeout
|
||||
}
|
||||
realmOptions, err := buildRealmOptions(ctx, logger, options.Realm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
var realmOptions *realm.Options
|
||||
if options.Realm != nil {
|
||||
queryOptions, err := adapter.DNSQueryOptionsFrom(ctx, options.Realm.STUNDomainResolver)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
httpClientTransport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.Realm.HTTPClient))
|
||||
if err != nil {
|
||||
return nil, E.Cause(err, "create realm http client")
|
||||
}
|
||||
dnsRouter := service.FromContext[adapter.DNSRouter](ctx)
|
||||
realmOptions = &realm.Options{
|
||||
ServerURL: options.Realm.ServerURL,
|
||||
Token: options.Realm.Token,
|
||||
RealmID: options.Realm.RealmID,
|
||||
STUNServers: options.Realm.STUNServers,
|
||||
HTTPClient: &http.Client{Transport: httpClientTransport},
|
||||
Resolver: func(ctx context.Context, host string, ipv4, ipv6 bool) ([]netip.Addr, error) {
|
||||
dnsOptions := queryOptions
|
||||
switch {
|
||||
case ipv4 && !ipv6:
|
||||
dnsOptions.Strategy = C.DomainStrategyIPv4Only
|
||||
case !ipv4 && ipv6:
|
||||
dnsOptions.Strategy = C.DomainStrategyIPv6Only
|
||||
}
|
||||
return dnsRouter.Lookup(ctx, host, dnsOptions)
|
||||
},
|
||||
Logger: logger,
|
||||
}
|
||||
}
|
||||
hysteriaService, err := hysteria2.NewService[int](hysteria2.ServiceOptions{
|
||||
Context: ctx,
|
||||
|
||||
@@ -3,6 +3,8 @@ package hysteria2
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"os"
|
||||
"time"
|
||||
@@ -18,12 +20,14 @@ import (
|
||||
qtls "github.com/sagernet/sing-quic"
|
||||
"github.com/sagernet/sing-quic/hysteria"
|
||||
"github.com/sagernet/sing-quic/hysteria2"
|
||||
"github.com/sagernet/sing-quic/hysteria2/realm"
|
||||
"github.com/sagernet/sing/common"
|
||||
"github.com/sagernet/sing/common/bufio"
|
||||
E "github.com/sagernet/sing/common/exceptions"
|
||||
"github.com/sagernet/sing/common/logger"
|
||||
M "github.com/sagernet/sing/common/metadata"
|
||||
N "github.com/sagernet/sing/common/network"
|
||||
"github.com/sagernet/sing/service"
|
||||
)
|
||||
|
||||
func RegisterOutbound(registry *outbound.Registry) {
|
||||
@@ -66,13 +70,43 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
|
||||
return nil, E.New("unknown obfs type: ", options.Obfs.Type)
|
||||
}
|
||||
}
|
||||
outboundDialer, err := dialer.New(ctx, options.DialerOptions, options.ServerIsDomain())
|
||||
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
||||
Context: ctx,
|
||||
Options: options.DialerOptions,
|
||||
RemoteIsDomain: options.ServerIsDomain(),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
realmOptions, err := buildRealmOptions(ctx, logger, options.Realm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
var realmOptions *realm.Options
|
||||
if options.Realm != nil {
|
||||
queryOptions, err := adapter.DNSQueryOptionsFrom(ctx, options.DialerOptions.DomainResolver)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
httpClientTransport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.Realm.HTTPClient))
|
||||
if err != nil {
|
||||
return nil, E.Cause(err, "create realm http client")
|
||||
}
|
||||
dnsRouter := service.FromContext[adapter.DNSRouter](ctx)
|
||||
realmOptions = &realm.Options{
|
||||
ServerURL: options.Realm.ServerURL,
|
||||
Token: options.Realm.Token,
|
||||
RealmID: options.Realm.RealmID,
|
||||
STUNServers: options.Realm.STUNServers,
|
||||
HTTPClient: &http.Client{Transport: httpClientTransport},
|
||||
Resolver: func(ctx context.Context, host string, ipv4, ipv6 bool) ([]netip.Addr, error) {
|
||||
dnsOptions := queryOptions
|
||||
switch {
|
||||
case ipv4 && !ipv6:
|
||||
dnsOptions.Strategy = C.DomainStrategyIPv4Only
|
||||
case !ipv4 && ipv6:
|
||||
dnsOptions.Strategy = C.DomainStrategyIPv6Only
|
||||
}
|
||||
return dnsRouter.Lookup(ctx, host, dnsOptions)
|
||||
},
|
||||
Logger: logger,
|
||||
}
|
||||
}
|
||||
networkList := options.Network.Build()
|
||||
client, err := hysteria2.NewClient(hysteria2.ClientOptions{
|
||||
|
||||
@@ -13,13 +13,11 @@ import (
|
||||
C "github.com/sagernet/sing-box/constant"
|
||||
"github.com/sagernet/sing-box/log"
|
||||
"github.com/sagernet/sing-box/option"
|
||||
"github.com/sagernet/sing-quic/hysteria2/realm"
|
||||
"github.com/sagernet/sing/common"
|
||||
E "github.com/sagernet/sing/common/exceptions"
|
||||
N "github.com/sagernet/sing/common/network"
|
||||
aTLS "github.com/sagernet/sing/common/tls"
|
||||
sHTTP "github.com/sagernet/sing/protocol/http"
|
||||
"github.com/sagernet/sing/service"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-chi/chi/v5/middleware"
|
||||
@@ -31,24 +29,6 @@ func RegisterRealmService(registry *boxService.Registry) {
|
||||
boxService.Register[option.HysteriaRealmServiceOptions](registry, C.TypeHysteriaRealm, NewRealmService)
|
||||
}
|
||||
|
||||
func buildRealmOptions(ctx context.Context, logger log.ContextLogger, options *option.Hysteria2Realm) (*realm.Options, error) {
|
||||
if options == nil {
|
||||
return nil, nil
|
||||
}
|
||||
transport, err := service.FromContext[adapter.HTTPClientManager](ctx).ResolveTransport(ctx, logger, common.PtrValueOrDefault(options.HTTPClient))
|
||||
if err != nil {
|
||||
return nil, E.Cause(err, "create realm http client")
|
||||
}
|
||||
return &realm.Options{
|
||||
ServerURL: options.ServerURL,
|
||||
Token: options.Token,
|
||||
RealmID: options.RealmID,
|
||||
STUNServers: options.STUNServers,
|
||||
HTTPClient: &http.Client{Transport: transport},
|
||||
Logger: logger,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type RealmService struct {
|
||||
boxService.Adapter
|
||||
ctx context.Context
|
||||
|
||||
Reference in New Issue
Block a user