This commit is contained in:
gospider
2025-04-02 15:13:38 +08:00
parent e7d6e15e04
commit 34a1587e94
6 changed files with 145 additions and 105 deletions

108
dial.go
View File

@@ -4,6 +4,7 @@ import (
"bufio"
"context"
"crypto/tls"
"encoding/binary"
"errors"
"io"
"net"
@@ -91,7 +92,7 @@ func newDialer(option DialOption) dialer {
func (obj *Dialer) dialContext(ctx *Response, network string, addr Address, isProxy bool) (net.Conn, error) {
var err error
if addr.IP == nil {
addr.IP, err = obj.loadHost(ctx, addr.Name)
addr.IP, err = obj.loadHost(ctx.Context(), addr.Name, ctx.option.DialOption)
}
if ctx.option != nil && ctx.option.Logger != nil {
if isProxy {
@@ -201,9 +202,9 @@ func (obj *Dialer) verifyProxyToRemote(ctx *Response, conn net.Conn, proxyTlsCon
}
case "socks5":
if isLast && ctx.option.ForceHttp3 {
packCon, err = obj.verifyUDPSocks5(ctx.Context(), conn, proxyAddress, remoteAddress)
packCon, err = obj.verifyUDPSocks5(ctx, conn, proxyAddress, remoteAddress)
} else {
err = obj.verifyTCPSocks5(conn, proxyAddress, remoteAddress)
err = obj.verifyTCPSocks5(ctx, conn, proxyAddress, remoteAddress)
}
if ctx.option.Logger != nil {
ctx.option.Logger(Log{
@@ -227,14 +228,7 @@ func (obj *Dialer) verifyProxyToRemote(ctx *Response, conn net.Conn, proxyTlsCon
}
}
func (obj *Dialer) LookupIPAddrWithCache(host string) net.IP {
msgDataAny, ok := obj.dnsIpData.Load(host)
if ok {
return msgDataAny.(msgClient).ip
}
return nil
}
func (obj *Dialer) loadHost(ctx *Response, host string) (net.IP, error) {
func (obj *Dialer) loadHost(ctx context.Context, host string, option DialOption) (net.IP, error) {
msgDataAny, ok := obj.dnsIpData.Load(host)
if ok {
msgdata := msgDataAny.(msgClient)
@@ -247,12 +241,12 @@ func (obj *Dialer) loadHost(ctx *Response, host string) (net.IP, error) {
return ip, nil
}
var addrType gtls.AddrType
if ctx.option.DialOption.AddrType != 0 {
addrType = ctx.option.DialOption.AddrType
} else if ctx.option.DialOption.GetAddrType != nil {
addrType = ctx.option.DialOption.GetAddrType(host)
if option.AddrType != 0 {
addrType = option.AddrType
} else if option.GetAddrType != nil {
addrType = option.GetAddrType(host)
}
ips, err := newDialer(ctx.option.DialOption).LookupIPAddr(ctx.Context(), host)
ips, err := newDialer(option).LookupIPAddr(ctx, host)
if err != nil {
return net.IP{}, err
}
@@ -261,6 +255,56 @@ func (obj *Dialer) loadHost(ctx *Response, host string) (net.IP, error) {
}
return ip, nil
}
func readUdpAddr(r io.Reader) (Address, error) {
var UdpAddress Address
var addrType [1]byte
var err error
if _, err = r.Read(addrType[:]); err != nil {
return UdpAddress, err
}
switch addrType[0] {
case ipv4Address:
addr := make(net.IP, net.IPv4len)
if _, err := io.ReadFull(r, addr); err != nil {
return UdpAddress, err
}
UdpAddress.IP = addr
case ipv6Address:
addr := make(net.IP, net.IPv6len)
if _, err := io.ReadFull(r, addr); err != nil {
return UdpAddress, err
}
UdpAddress.IP = addr
case fqdnAddress:
if _, err := r.Read(addrType[:]); err != nil {
return UdpAddress, err
}
addrLen := int(addrType[0])
fqdn := make([]byte, addrLen)
if _, err := io.ReadFull(r, fqdn); err != nil {
return UdpAddress, err
}
UdpAddress.Name = string(fqdn)
default:
return UdpAddress, errors.New("invalid atyp")
}
var port [2]byte
if _, err := io.ReadFull(r, port[:]); err != nil {
return UdpAddress, err
}
UdpAddress.Port = int(binary.BigEndian.Uint16(port[:]))
return UdpAddress, nil
}
func (obj *Dialer) ReadUdpAddr(ctx context.Context, r io.Reader, option DialOption) (Address, error) {
udpAddress, err := readUdpAddr(r)
if err != nil {
return udpAddress, err
}
if udpAddress.Name != "" {
udpAddress.IP, err = obj.loadHost(ctx, udpAddress.Name, option)
}
return udpAddress, err
}
func (obj *Dialer) addrToIp(host string, ips []net.IPAddr, addrType gtls.AddrType) (net.IP, error) {
ip, err := obj.lookupIPAddr(ips, addrType)
if err != nil {
@@ -269,7 +313,7 @@ func (obj *Dialer) addrToIp(host string, ips []net.IPAddr, addrType gtls.AddrTyp
obj.dnsIpData.Store(host, msgClient{time: time.Now(), ip: ip})
return ip, nil
}
func (obj *Dialer) verifySocks5(conn net.Conn, network string, proxyAddr Address, remoteAddr Address) (proxyAddress Address, err error) {
func (obj *Dialer) verifySocks5(ctx *Response, conn net.Conn, network string, proxyAddr Address, remoteAddr Address) (proxyAddress Address, err error) {
err = obj.verifySocks5Auth(conn, proxyAddr)
if err != nil {
err = tools.WrapError(err, "verifySocks5Auth error")
@@ -299,27 +343,27 @@ func (obj *Dialer) verifySocks5(conn net.Conn, network string, proxyAddr Address
err = errors.New("socks conn error")
return
}
proxyAddress, err = ReadUdpAddr(conn)
proxyAddress, err = obj.ReadUdpAddr(ctx.Context(), conn, ctx.option.DialOption)
return
}
func (obj *Dialer) verifyTCPSocks5(conn net.Conn, proxyAddr Address, remoteAddr Address) (err error) {
_, err = obj.verifySocks5(conn, "tcp", proxyAddr, remoteAddr)
func (obj *Dialer) verifyTCPSocks5(ctx *Response, conn net.Conn, proxyAddr Address, remoteAddr Address) (err error) {
_, err = obj.verifySocks5(ctx, conn, "tcp", proxyAddr, remoteAddr)
return
}
func (obj *Dialer) verifyUDPSocks5(ctx context.Context, conn net.Conn, proxyAddr Address, remoteAddr Address) (wrapConn net.PacketConn, err error) {
func (obj *Dialer) verifyUDPSocks5(ctx *Response, conn net.Conn, proxyAddr Address, remoteAddr Address) (wrapConn net.PacketConn, err error) {
remoteAddr.NetWork = "udp"
proxyAddress, err := obj.verifySocks5(conn, "udp", proxyAddr, remoteAddr)
proxyAddress, err := obj.verifySocks5(ctx, conn, "udp", proxyAddr, remoteAddr)
if err != nil {
return
}
var listener net.ListenConfig
wrapConn, err = listener.ListenPacket(ctx, "udp", ":0")
wrapConn, err = listener.ListenPacket(ctx.Context(), "udp", ":0")
if err != nil {
return
}
var cnl context.CancelFunc
udpCtx, cnl := context.WithCancel(context.TODO())
wrapConn = NewUDPConn(udpCtx, wrapConn, &net.UDPAddr{IP: proxyAddress.IP, Port: proxyAddress.Port})
wrapConn = NewUDPConn(udpCtx, wrapConn, &net.UDPAddr{IP: proxyAddress.IP, Port: proxyAddress.Port}, remoteAddr)
go func() {
io.Copy(io.Discard, conn)
cnl()
@@ -381,17 +425,15 @@ func (obj *Dialer) verifySocks5Auth(conn net.Conn, proxyAddr Address) (err error
}
func (obj *Dialer) lookupIPAddr(ips []net.IPAddr, addrType gtls.AddrType) (net.IP, error) {
for _, ipAddr := range ips {
ip := ipAddr.IP
if ipType := gtls.ParseIp(ip); ipType == 4 || ipType == 6 {
if addrType == 0 || addrType == ipType {
return ip, nil
if ipType := gtls.ParseIp(ipAddr.IP); ipType == gtls.Ipv4 || ipType == gtls.Ipv6 {
if addrType == gtls.AutoIp || addrType == ipType {
return ipAddr.IP, nil
}
}
}
for _, ipAddr := range ips {
ip := ipAddr.IP
if ipType := gtls.ParseIp(ip); ipType == 4 || ipType == 6 {
return ip, nil
if ipType := gtls.ParseIp(ipAddr.IP); ipType == gtls.Ipv4 || ipType == gtls.Ipv6 {
return ipAddr.IP, nil
}
}
return nil, errors.New("dns parse host error")
@@ -422,7 +464,7 @@ func (obj *Dialer) Socks5TcpProxy(ctx *Response, proxyAddr Address, remoteAddr A
didVerify := make(chan struct{})
go func() {
defer close(didVerify)
err = obj.verifyTCPSocks5(conn, proxyAddr, remoteAddr)
err = obj.verifyTCPSocks5(ctx, conn, proxyAddr, remoteAddr)
}()
select {
case <-ctx.Context().Done():
@@ -449,7 +491,7 @@ func (obj *Dialer) Socks5UdpProxy(ctx *Response, proxyAddress Address, remoteAdd
didVerify := make(chan struct{})
go func() {
defer close(didVerify)
udpConn, err = obj.verifyUDPSocks5(ctx.Context(), conn, proxyAddress, remoteAddress)
udpConn, err = obj.verifyUDPSocks5(ctx, conn, proxyAddress, remoteAddress)
if ctx.option.Logger != nil {
ctx.option.Logger(Log{
Id: ctx.requestId,

6
go.mod
View File

@@ -4,7 +4,7 @@ go 1.24.0
require (
github.com/gospider007/bar v0.0.0-20250217074946-47896d8de2ba
github.com/gospider007/bs4 v0.0.0-20250310095132-86f4213a6c1a
github.com/gospider007/bs4 v0.0.0-20250327035236-809c371d35e3
github.com/gospider007/gson v0.0.0-20250310035055-50bf98aae917
github.com/gospider007/gtls v0.0.0-20250324005721-d358b4cc74c6
github.com/gospider007/http2 v0.0.0-20250307152953-67c9f881b5be
@@ -12,12 +12,12 @@ require (
github.com/gospider007/ja3 v0.0.0-20250309093815-ea9cc2528120
github.com/gospider007/proxy v0.0.0-20250325005536-ef27fe24e9c8
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c
github.com/gospider007/tools v0.0.0-20250326021839-4d8ab14c180f
github.com/gospider007/tools v0.0.0-20250327035045-4414145a1ec8
github.com/gospider007/websocket v0.0.0-20250306064730-90385d6147ad
github.com/quic-go/quic-go v0.50.1
github.com/refraction-networking/uquic v0.0.6
github.com/refraction-networking/utls v1.6.7
golang.org/x/net v0.37.0
golang.org/x/net v0.38.0
gopkg.in/errgo.v2 v2.1.0
)

16
go.sum
View File

@@ -60,7 +60,6 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
@@ -106,8 +105,8 @@ github.com/gospider007/bar v0.0.0-20250217074946-47896d8de2ba h1:8DK0d1nUTsMbOgF
github.com/gospider007/bar v0.0.0-20250217074946-47896d8de2ba/go.mod h1:HGEEIVnysptCXwsdU4E82uQu0F4ObU/5+KWHIdJCUbY=
github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7 h1:QP46FdP6nJET+bSdm8wxjIzBMnu2lKraoypfU9bLGV4=
github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7/go.mod h1:yDzKXJzaYENfMvleqwdo362NE+BXDhwtKXRUQUWHH+I=
github.com/gospider007/bs4 v0.0.0-20250310095132-86f4213a6c1a h1:vJg/jZU2jq7o63KRQmsSnFGsf0HwQw5CUm0VcJM182A=
github.com/gospider007/bs4 v0.0.0-20250310095132-86f4213a6c1a/go.mod h1:R2qPFPT8PU74dLVm6jw7aIB5y5wILsvhZ/Ji6RdOeqU=
github.com/gospider007/bs4 v0.0.0-20250327035236-809c371d35e3 h1:opXDrRT3G/JU+DCAkn24jIFNgbACYnr30hsjk89wBsc=
github.com/gospider007/bs4 v0.0.0-20250327035236-809c371d35e3/go.mod h1:R2qPFPT8PU74dLVm6jw7aIB5y5wILsvhZ/Ji6RdOeqU=
github.com/gospider007/gson v0.0.0-20250310035055-50bf98aae917 h1:y0PkitoC/PjgM8Kkk+n9r2gkZXUy+JjjZZs7L+QClUk=
github.com/gospider007/gson v0.0.0-20250310035055-50bf98aae917/go.mod h1:3qme4vU9wRm58hRcg8k9ZY+TrFbtemp4eDjbvW8zQgQ=
github.com/gospider007/gtls v0.0.0-20250324005721-d358b4cc74c6 h1:LpQa63CYHuKLT1R0c320ca4+G3ePZV6Up9nkXeu+qkA=
@@ -124,10 +123,8 @@ github.com/gospider007/proxy v0.0.0-20250325005536-ef27fe24e9c8 h1:imFrte/aU7tUz
github.com/gospider007/proxy v0.0.0-20250325005536-ef27fe24e9c8/go.mod h1:gHCIExOm8iRsIZWNbNwMXjk/az/DFeQvShCfd6ea6f4=
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c h1:8/Cf+c2680tkWJ+ueZ9RLLK5R5R8nhE8pNBUPHjkvkM=
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c/go.mod h1:dd8aDIUG1vDPP5r+vHBtiUK0Zn6uk3SsWt1ZvmCCHLs=
github.com/gospider007/tools v0.0.0-20250314001755-8fd6f4fc62e2 h1:rYxxxIEKkDSq/4ycta100U1jbY2pxcTgAtqBZGv1wl8=
github.com/gospider007/tools v0.0.0-20250314001755-8fd6f4fc62e2/go.mod h1:+i3eo8TFRdB+xeSzj9jtWgInb9DCzKcGjpooaL751+U=
github.com/gospider007/tools v0.0.0-20250326021839-4d8ab14c180f h1:5l+ggng5VYwhPHv5UwgB9BwlW6O1gPsj93H9FDtwEUs=
github.com/gospider007/tools v0.0.0-20250326021839-4d8ab14c180f/go.mod h1:nQsSTbWPumjzzPGZ9mxPVGx6z0LRnki4Z1FPPrZhlIQ=
github.com/gospider007/tools v0.0.0-20250327035045-4414145a1ec8 h1:40XQd3jsFGhBo+WrfSUPWCRtAso16VExs249Qnl/f5k=
github.com/gospider007/tools v0.0.0-20250327035045-4414145a1ec8/go.mod h1:nQsSTbWPumjzzPGZ9mxPVGx6z0LRnki4Z1FPPrZhlIQ=
github.com/gospider007/websocket v0.0.0-20250306064730-90385d6147ad h1:Q9qJ8G1ErWJamDKujBRKcUOv9FNKp/2HYmkOU2x6ygg=
github.com/gospider007/websocket v0.0.0-20250306064730-90385d6147ad/go.mod h1:5BflrS9KoBQicLKpSpA9tvFlohlVpcsXgGch/pYobng=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -162,7 +159,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/libdns/libdns v0.2.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8=
github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30=
github.com/mholt/acmez/v3 v3.1.1 h1:Jh+9uKHkPxUJdxM16q5mOr+G2V0aqkuFtNA28ihCxhQ=
github.com/mholt/acmez/v3 v3.1.1/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
github.com/mholt/archives v0.1.0 h1:FacgJyrjiuyomTuNA92X5GyRBRZjE43Y/lrzKIlF35Q=
@@ -324,8 +320,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

View File

@@ -125,8 +125,8 @@ func (obj *roundTripper) ghttp3Dial(ctx *Response, remoteAddress Address, proxyA
tlsConfig := ctx.option.TlsConfig.Clone()
tlsConfig.NextProtos = []string{http3.NextProtoH3}
tlsConfig.ServerName = remoteAddress.Host
if remoteAddress.IP == nil {
remoteAddress.IP, err = obj.dialer.loadHost(ctx, remoteAddress.Name)
if remoteAddress.IP == nil && len(proxyAddress) == 0 {
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Name, ctx.option.DialOption)
if err != nil {
return nil, err
}
@@ -160,8 +160,8 @@ func (obj *roundTripper) uhttp3Dial(ctx *Response, spec uquic.QUICSpec, remoteAd
tlsConfig := ctx.option.UtlsConfig.Clone()
tlsConfig.NextProtos = []string{http3.NextProtoH3}
tlsConfig.ServerName = remoteAddress.Host
if remoteAddress.IP == nil {
remoteAddress.IP, err = obj.dialer.loadHost(ctx, remoteAddress.Name)
if remoteAddress.IP == nil && len(proxyAddress) == 0 {
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Name, ctx.option.DialOption)
if err != nil {
return nil, err
}

View File

@@ -85,62 +85,24 @@ func (a Address) String() string {
func (a Address) Network() string {
return a.NetWork
}
func ReadUdpAddr(r io.Reader) (Address, error) {
UdpAddress := Address{}
var addrType [1]byte
if _, err := r.Read(addrType[:]); err != nil {
return UdpAddress, err
}
switch addrType[0] {
case ipv4Address:
addr := make(net.IP, net.IPv4len)
if _, err := io.ReadFull(r, addr); err != nil {
return UdpAddress, err
}
UdpAddress.IP = addr
case ipv6Address:
addr := make(net.IP, net.IPv6len)
if _, err := io.ReadFull(r, addr); err != nil {
return UdpAddress, err
}
UdpAddress.IP = addr
case fqdnAddress:
if _, err := r.Read(addrType[:]); err != nil {
return UdpAddress, err
}
addrLen := int(addrType[0])
fqdn := make([]byte, addrLen)
if _, err := io.ReadFull(r, fqdn); err != nil {
return UdpAddress, err
}
UdpAddress.Name = string(fqdn)
default:
return UdpAddress, errors.New("invalid atyp")
}
var port [2]byte
if _, err := io.ReadFull(r, port[:]); err != nil {
return UdpAddress, err
}
UdpAddress.Port = int(binary.BigEndian.Uint16(port[:]))
return UdpAddress, nil
}
type UDPConn struct {
ctx context.Context
proxyAddress net.Addr
ctx context.Context
net.PacketConn
prefix []byte
bufRead [MaxUdpPacket]byte
bufWrite [MaxUdpPacket]byte
prefix []byte
bufRead [MaxUdpPacket]byte
bufWrite [MaxUdpPacket]byte
proxyAddress net.Addr
remoteAddress Address
}
func NewUDPConn(ctx context.Context, packConn net.PacketConn, proxyAddress net.Addr) *UDPConn {
func NewUDPConn(ctx context.Context, packConn net.PacketConn, proxyAddress net.Addr, remoteAddress Address) *UDPConn {
return &UDPConn{
ctx: ctx,
PacketConn: packConn,
proxyAddress: proxyAddress,
prefix: []byte{0, 0, 0},
ctx: ctx,
remoteAddress: remoteAddress,
PacketConn: packConn,
proxyAddress: proxyAddress,
prefix: []byte{0, 0, 0},
}
}
@@ -153,7 +115,7 @@ func (c *UDPConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
return 0, nil, errors.New("bad header")
}
buf := bytes.NewBuffer(c.bufRead[len(c.prefix):n])
a, err := ReadUdpAddr(buf)
a, err := readUdpAddr(buf)
if err != nil {
return 0, nil, err
}
@@ -164,8 +126,7 @@ func (c *UDPConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
func (c *UDPConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
buf := bytes.NewBuffer(c.bufWrite[:0])
buf.Write(c.prefix)
udpAddr := addr.(*net.UDPAddr)
err = WriteUdpAddr(buf, Address{IP: udpAddr.IP, Port: udpAddr.Port})
err = WriteUdpAddr(buf, c.remoteAddress)
if err != nil {
return 0, err
}

View File

@@ -4,7 +4,10 @@ import (
"context"
"log"
"testing"
"time"
"github.com/gospider007/gtls"
"github.com/gospider007/proxy"
"github.com/gospider007/requests"
)
@@ -27,6 +30,44 @@ func TestHttp3(t *testing.T) {
t.Error("resp.Proto!= HTTP/3.0")
}
}
func TestHttp3Proxy(t *testing.T) {
proxyAddress := "127.0.0.1:1080"
// server, err := socks5.NewClassicServer("127.0.0.1:1080", "127.0.0.1", "", "", 0, 0)
// if err != nil {
// log.Println(err)
// return
// }
// go server.ListenAndServe(nil)
proxyC, err := proxy.NewClient(nil, proxy.ClientOption{Addr: proxyAddress, DisVerify: true})
if err != nil {
log.Println(err)
return
}
defer proxyC.Close()
go proxyC.Run()
// [0 87 164 1 116 253 33 138 106 82]
// [0 87 162 31 139 8 0 0 0 0]
time.Sleep(time.Second)
// href := "https://google.com"
href := "https://cloudflare-quic.com/"
resp, err := requests.Get(context.Background(), href,
requests.RequestOption{
ClientOption: requests.ClientOption{
DialOption: requests.DialOption{
// AddrType: gtls.Ipv4,
GetAddrType: func(host string) gtls.AddrType {
log.Print("我开始喽")
return gtls.Ipv4
},
},
Proxy: "socks5://" + proxyAddress,
ForceHttp3: true,
},
})
if err != nil {
log.Panic(err)
return
}
log.Print(resp.StatusCode())
log.Print(resp.Proto())
}