mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
sync
This commit is contained in:
108
dial.go
108
dial.go
@@ -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
6
go.mod
@@ -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
16
go.sum
@@ -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=
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
67
socks5.go
67
socks5.go
@@ -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
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user