This commit is contained in:
gospider
2025-06-03 19:08:16 +08:00
parent ebb00b5e9b
commit 7ceeb59ed0
6 changed files with 118 additions and 24 deletions

83
compressConn.go Normal file
View File

@@ -0,0 +1,83 @@
package requests
import (
"errors"
"io"
"net"
"strings"
"time"
"github.com/mholt/archives"
)
type CompressionConn struct {
conn net.Conn
w io.WriteCloser
r io.ReadCloser
f interface{ Flush() error }
}
func NewCompressionConn(decode string, conn net.Conn) (net.Conn, error) {
var r io.ReadCloser
var w io.WriteCloser
var err error
switch strings.ToLower(decode) {
case "zstd":
r, w, err = newZstdConn(conn)
default:
return nil, errors.New("unsupported compression type")
}
if err != nil {
return nil, err
}
ccon := &CompressionConn{conn: conn, r: r, w: w}
if f, ok := w.(interface{ Flush() error }); ok {
ccon.f = f
}
return ccon, nil
}
func newZstdConn(conn net.Conn) (io.ReadCloser, io.WriteCloser, error) {
r, err := archives.Zstd{}.OpenReader(conn)
if err != nil {
return nil, nil, err
}
w, err := archives.Zstd{}.OpenWriter(conn)
if err != nil {
return nil, nil, err
}
return r, w, nil
}
func (obj *CompressionConn) Read(b []byte) (n int, err error) {
return obj.r.Read(b)
}
func (obj *CompressionConn) Write(b []byte) (n int, err error) {
n, err = obj.w.Write(b)
if err != nil {
return
}
obj.w.(interface{ Flush() error }).Flush()
// err = obj.f.Flush()
return
}
func (obj *CompressionConn) Close() error {
obj.w.Close()
obj.r.Close()
return obj.conn.Close()
}
func (obj *CompressionConn) LocalAddr() net.Addr {
return obj.conn.LocalAddr()
}
func (obj *CompressionConn) RemoteAddr() net.Addr {
return obj.conn.RemoteAddr()
}
func (obj *CompressionConn) SetDeadline(t time.Time) error {
return obj.conn.SetDeadline(t)
}
func (obj *CompressionConn) SetReadDeadline(t time.Time) error {
return obj.conn.SetReadDeadline(t)
}
func (obj *CompressionConn) SetWriteDeadline(t time.Time) error {
return obj.conn.SetWriteDeadline(t)
}

View File

@@ -135,6 +135,9 @@ func (obj *Dialer) dialContext(ctx *Response, network string, addr Address, isPr
})
}
}
if err == nil && addr.Compression != "" {
return NewCompressionConn(addr.Compression, con)
}
return con, err
}
func (obj *Dialer) DialContext(ctx *Response, network string, addr Address) (net.Conn, error) {

11
go.mod
View File

@@ -5,14 +5,15 @@ go 1.24.0
require (
github.com/gospider007/bar v0.0.0-20250217074946-47896d8de2ba
github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9
github.com/gospider007/gson v0.0.0-20250413121440-c0f3162075f1
github.com/gospider007/gson v0.0.0-20250530002642-aee7c1b761df
github.com/gospider007/gtls v0.0.0-20250427082859-097a9e35c601
github.com/gospider007/http2 v0.0.0-20250427082905-4aed0707e580
github.com/gospider007/http3 v0.0.0-20250416085920-b642f3f91f47
github.com/gospider007/ja3 v0.0.0-20250427082442-f7dc5fb959e6
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c
github.com/gospider007/tools v0.0.0-20250429035126-c40129cf2865
github.com/gospider007/tools v0.0.0-20250529114105-be4d4dbf36a2
github.com/gospider007/websocket v0.0.0-20250429035144-b1cf6819063a
github.com/mholt/archives v0.1.2
github.com/quic-go/quic-go v0.52.0
github.com/refraction-networking/uquic v0.0.6
github.com/refraction-networking/utls v1.7.3
@@ -35,12 +36,13 @@ require (
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
github.com/gaukas/clienthellod v0.4.2 // indirect
github.com/gaukas/godicttls v0.0.4 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.4.0 // indirect
github.com/google/gopacket v1.1.19 // indirect
github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect
github.com/google/pprof v0.0.0-20250602020802-c6617b811d0e // indirect
github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7 // indirect
github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
@@ -51,7 +53,6 @@ require (
github.com/kr/pretty v0.3.1 // indirect
github.com/libdns/libdns v1.1.0 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/mholt/archives v0.1.2 // indirect
github.com/miekg/dns v1.1.66 // indirect
github.com/minio/minlz v1.0.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -79,7 +80,7 @@ require (
go.uber.org/zap/exp v0.3.0 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.38.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect
golang.org/x/image v0.27.0 // indirect
golang.org/x/mod v0.24.0 // indirect
golang.org/x/sync v0.14.0 // indirect

20
go.sum
View File

@@ -58,8 +58,8 @@ github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXb
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
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-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
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=
@@ -97,8 +97,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4=
github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/pprof v0.0.0-20250602020802-c6617b811d0e h1:FJta/0WsADCe1r9vQjdHbd3KuiLPu7Y9WlyLGwMUNyE=
github.com/google/pprof v0.0.0-20250602020802-c6617b811d0e/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
@@ -108,8 +108,8 @@ github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7 h1:QP46FdP6nJET+b
github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7/go.mod h1:yDzKXJzaYENfMvleqwdo362NE+BXDhwtKXRUQUWHH+I=
github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9 h1:V/Fuzox1GNZzlZCY548Na3mdfjLmWoSqexa53d3dKyE=
github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9/go.mod h1:KBnaNWpVupRQbPZ6jz2jhX/hnRK1w30RKJvl3Micjws=
github.com/gospider007/gson v0.0.0-20250413121440-c0f3162075f1 h1:rOs+Mh3HqALWjHmw5PsiehbSPgvwzPyv7t4H2OUEQQY=
github.com/gospider007/gson v0.0.0-20250413121440-c0f3162075f1/go.mod h1:WHM2YHN+TKVVsyC4aqqMm2IwP6FvoCyRyGSVUNKQImk=
github.com/gospider007/gson v0.0.0-20250530002642-aee7c1b761df h1:Xi1Sm1caw39tXUVZAuVAVSdJ9x7h0Y1bPOw3sxxkzsM=
github.com/gospider007/gson v0.0.0-20250530002642-aee7c1b761df/go.mod h1:+O/+tzjrqz67RehAyJaRApESHo1Z9fuxBeQmQ8GMELw=
github.com/gospider007/gtls v0.0.0-20250427082859-097a9e35c601 h1:0r67F8bARNcUwMpSVCgp5u92sP01kWgZLRliRFKmgMM=
github.com/gospider007/gtls v0.0.0-20250427082859-097a9e35c601/go.mod h1:UzfvBwe5Jtz1nKzlGSH4q8VP/9XfcsmMFDahR3PgCkM=
github.com/gospider007/http2 v0.0.0-20250427082905-4aed0707e580 h1:JLZeCin6giqOV3sAy7BGqFkc+qHvO389O/aTT5JJc1k=
@@ -122,8 +122,8 @@ github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d h1:+Fih572EdNmYC
github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d/go.mod h1:3u6J+nbdWhCNJGiQjq/hKSukn2k6ebjd98rd2+fzKNo=
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-20250429035126-c40129cf2865 h1:nw7vt2gENhD3gTRFCFPOwGNOG8ArTu4a0TFP3zZV/yw=
github.com/gospider007/tools v0.0.0-20250429035126-c40129cf2865/go.mod h1:eJqPrWBiWta5l8bU/LjCun1J2LLBcvBH1HEWz/u/r6E=
github.com/gospider007/tools v0.0.0-20250529114105-be4d4dbf36a2 h1:w5KTBR3sR3o/MCQjLLTgDIWQF3pZwkN3P65viwxv0BE=
github.com/gospider007/tools v0.0.0-20250529114105-be4d4dbf36a2/go.mod h1:gGaFJtYG/UPq+HVYhhVGhSOmF6NZMRayw3FflTOb27g=
github.com/gospider007/websocket v0.0.0-20250429035144-b1cf6819063a h1:DJMk+oALIJg3ArN5/DIPrQagWQL1Qi/c3DlXT9l1dGo=
github.com/gospider007/websocket v0.0.0-20250429035144-b1cf6819063a/go.mod h1:0yVYF7b5kRayyUzAVgg6h1x+eZujKoSaA4n2krG5F7g=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
@@ -281,8 +281,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA=
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=

View File

@@ -65,13 +65,14 @@ func WriteUdpAddr(w io.Writer, addr Address) error {
}
type Address struct {
User string
Password string
Host string
NetWork string
Scheme string
IP net.IP
Port int
User string
Password string
Host string
NetWork string
Scheme string
IP net.IP
Compression string
Port int
}
func (a Address) String() string {

View File

@@ -41,9 +41,15 @@ func GetAddressWithUrl(uurl *url.URL) (addr Address, err error) {
Host: uurl.Hostname(),
}
portStr := uurl.Port()
addr.Scheme = uurl.Scheme
if strings.Count(uurl.Scheme, "+") == 1 {
nns := strings.Split(uurl.Scheme, "+")
addr.Compression = nns[0]
addr.Scheme = nns[1]
} else {
addr.Scheme = uurl.Scheme
}
if portStr == "" {
switch uurl.Scheme {
switch addr.Scheme {
case "http":
addr.Port = 80
case "https":