mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
sync
This commit is contained in:
@@ -50,29 +50,6 @@ func GetCompressionByte(decode string) (byte, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var compressionData = map[byte]compression{
|
|
||||||
40: {
|
|
||||||
name: "zstd",
|
|
||||||
openReader: newZstdReader,
|
|
||||||
openWriter: newZstdWriter,
|
|
||||||
},
|
|
||||||
255: {
|
|
||||||
name: "s2",
|
|
||||||
openReader: newSnappyReader,
|
|
||||||
openWriter: newSnappyWriter,
|
|
||||||
},
|
|
||||||
92: {
|
|
||||||
name: "flate",
|
|
||||||
openReader: newFlateReader,
|
|
||||||
openWriter: newFlateWriter,
|
|
||||||
},
|
|
||||||
93: {
|
|
||||||
name: "minlz",
|
|
||||||
openReader: newMinlzReader,
|
|
||||||
openWriter: newMinlzWriter,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewCompressionWithByte(b byte) (Compression, error) {
|
func NewCompressionWithByte(b byte) (Compression, error) {
|
||||||
c, ok := compressionData[b]
|
c, ok := compressionData[b]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -106,7 +83,7 @@ func NewCompressionWithByte(b byte) (Compression, error) {
|
|||||||
func NewCompression(decode string) (Compression, error) {
|
func NewCompression(decode string) (Compression, error) {
|
||||||
decode = strings.ToLower(decode)
|
decode = strings.ToLower(decode)
|
||||||
for b, c := range compressionData {
|
for b, c := range compressionData {
|
||||||
if c.String() == decode {
|
if c.name == decode {
|
||||||
return NewCompressionWithByte(b)
|
return NewCompressionWithByte(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +117,10 @@ func (obj *CompressionConn) Write(b []byte) (n int, err error) {
|
|||||||
return obj.w.Write(b)
|
return obj.w.Write(b)
|
||||||
}
|
}
|
||||||
func (obj *CompressionConn) Close() error {
|
func (obj *CompressionConn) Close() error {
|
||||||
return obj.conn.Close()
|
err := obj.conn.Close()
|
||||||
|
obj.w.Close()
|
||||||
|
obj.r.Close()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *CompressionConn) LocalAddr() net.Addr {
|
func (obj *CompressionConn) LocalAddr() net.Addr {
|
||||||
|
|||||||
@@ -10,130 +10,191 @@ import (
|
|||||||
"github.com/minio/minlz"
|
"github.com/minio/minlz"
|
||||||
)
|
)
|
||||||
|
|
||||||
// zstd pool
|
type compreData struct {
|
||||||
var zstdWriterPool = sync.Pool{
|
rpool *sync.Pool
|
||||||
New: func() any {
|
wpool *sync.Pool
|
||||||
c, _ := zstd.NewWriter(nil, zstd.WithWindowSize(32*1024))
|
name string
|
||||||
return c
|
openReader func(r io.Reader) (io.ReadCloser, error)
|
||||||
},
|
openWriter func(w io.Writer) (io.WriteCloser, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
var compressionData map[byte]compreData
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
compressionData = map[byte]compreData{
|
||||||
|
40: {
|
||||||
|
name: "zstd",
|
||||||
|
rpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
wpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
openReader: newZstdReader,
|
||||||
|
openWriter: newZstdWriter,
|
||||||
|
},
|
||||||
|
255: {
|
||||||
|
name: "s2",
|
||||||
|
rpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
wpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
openReader: newSnappyReader,
|
||||||
|
openWriter: newSnappyWriter,
|
||||||
|
},
|
||||||
|
92: {
|
||||||
|
name: "flate",
|
||||||
|
rpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
wpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
openReader: newFlateReader,
|
||||||
|
openWriter: newFlateWriter,
|
||||||
|
},
|
||||||
|
93: {
|
||||||
|
name: "minlz",
|
||||||
|
rpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
wpool: &sync.Pool{New: func() any { return nil }},
|
||||||
|
openReader: newMinlzReader,
|
||||||
|
openWriter: newMinlzWriter,
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newZstdWriter(w io.Writer) (io.WriteCloser, error) {
|
func newZstdWriter(w io.Writer) (io.WriteCloser, error) {
|
||||||
z := zstdWriterPool.Get().(*zstd.Encoder)
|
pool := compressionData[40].wpool
|
||||||
z.Reset(w)
|
cp := pool.Get()
|
||||||
|
var z *zstd.Encoder
|
||||||
|
var err error
|
||||||
|
if cp == nil {
|
||||||
|
z, err = zstd.NewWriter(w, zstd.WithWindowSize(32*1024))
|
||||||
|
} else {
|
||||||
|
z = cp.(*zstd.Encoder)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return newWriterCompression(z, func() {
|
return newWriterCompression(z, func() {
|
||||||
z.Reset(nil)
|
z.Reset(nil)
|
||||||
zstdWriterPool.Put(z)
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var zstdReaderPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
w, _ := zstd.NewReader(nil)
|
|
||||||
return w
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newZstdReader(w io.Reader) (io.ReadCloser, error) {
|
func newZstdReader(w io.Reader) (io.ReadCloser, error) {
|
||||||
z := zstdReaderPool.Get().(*zstd.Decoder)
|
pool := compressionData[40].rpool
|
||||||
z.Reset(w)
|
cp := pool.Get()
|
||||||
|
var z *zstd.Decoder
|
||||||
|
var err error
|
||||||
|
if cp == nil {
|
||||||
|
z, err = zstd.NewReader(w)
|
||||||
|
} else {
|
||||||
|
z = cp.(*zstd.Decoder)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return newReaderCompression(io.NopCloser(z), func() {
|
return newReaderCompression(io.NopCloser(z), func() {
|
||||||
z.Reset(nil)
|
z.Reset(nil)
|
||||||
zstdReaderPool.Put(z)
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// snappy pool
|
// snappy pool
|
||||||
var snappyWriterPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
return snappy.NewBufferedWriter(nil)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSnappyWriter(w io.Writer) (io.WriteCloser, error) {
|
func newSnappyWriter(w io.Writer) (io.WriteCloser, error) {
|
||||||
s := snappyWriterPool.Get().(*snappy.Writer)
|
pool := compressionData[255].wpool
|
||||||
s.Reset(w)
|
cp := pool.Get()
|
||||||
return newWriterCompression(s, func() {
|
var z *snappy.Writer
|
||||||
s.Reset(nil)
|
if cp == nil {
|
||||||
snappyWriterPool.Put(s)
|
z = snappy.NewBufferedWriter(w)
|
||||||
|
} else {
|
||||||
|
z = cp.(*snappy.Writer)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
return newWriterCompression(z, func() {
|
||||||
|
z.Reset(nil)
|
||||||
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var snappyReaderPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
return snappy.NewReader(nil)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSnappyReader(w io.Reader) (io.ReadCloser, error) {
|
func newSnappyReader(w io.Reader) (io.ReadCloser, error) {
|
||||||
s := snappyReaderPool.Get().(*snappy.Reader)
|
pool := compressionData[255].rpool
|
||||||
s.Reset(w)
|
cp := pool.Get()
|
||||||
return newReaderCompression(io.NopCloser(s), func() {
|
var z *snappy.Reader
|
||||||
s.Reset(nil)
|
if cp == nil {
|
||||||
snappyReaderPool.Put(s)
|
z = snappy.NewReader(w)
|
||||||
|
} else {
|
||||||
|
z = cp.(*snappy.Reader)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
return newReaderCompression(io.NopCloser(z), func() {
|
||||||
|
z.Reset(nil)
|
||||||
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// flate pool
|
// flate pool
|
||||||
var flateWriterPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
w, _ := flate.NewWriter(nil, flate.DefaultCompression)
|
|
||||||
return w
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newFlateWriter(w io.Writer) (io.WriteCloser, error) {
|
func newFlateWriter(w io.Writer) (io.WriteCloser, error) {
|
||||||
f := flateWriterPool.Get().(*flate.Writer)
|
pool := compressionData[92].wpool
|
||||||
f.Reset(w)
|
cp := pool.Get()
|
||||||
return newWriterCompression(f, func() {
|
var z *flate.Writer
|
||||||
f.Reset(nil)
|
var err error
|
||||||
flateWriterPool.Put(f)
|
if cp == nil {
|
||||||
|
z, err = flate.NewWriter(w, flate.DefaultCompression)
|
||||||
|
} else {
|
||||||
|
z = cp.(*flate.Writer)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return newWriterCompression(z, func() {
|
||||||
|
z.Reset(nil)
|
||||||
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var flateReaderPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
return flate.NewReader(nil)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newFlateReader(w io.Reader) (io.ReadCloser, error) {
|
func newFlateReader(w io.Reader) (io.ReadCloser, error) {
|
||||||
r := flateReaderPool.Get().(io.ReadCloser)
|
pool := compressionData[92].rpool
|
||||||
f := r.(flate.Resetter)
|
cp := pool.Get()
|
||||||
err := f.Reset(w, nil)
|
var z io.ReadCloser
|
||||||
return newReaderCompression(r, func() {
|
var f flate.Resetter
|
||||||
|
if cp == nil {
|
||||||
|
z = flate.NewReader(w)
|
||||||
|
f = z.(flate.Resetter)
|
||||||
|
} else {
|
||||||
|
z = cp.(io.ReadCloser)
|
||||||
|
f = z.(flate.Resetter)
|
||||||
|
f.Reset(w, nil)
|
||||||
|
}
|
||||||
|
return newReaderCompression(z, func() {
|
||||||
f.Reset(nil, nil)
|
f.Reset(nil, nil)
|
||||||
flateReaderPool.Put(r)
|
pool.Put(z)
|
||||||
}), err
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// minlz pool
|
// minlz pool
|
||||||
var minlzWriterPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
return minlz.NewWriter(nil, minlz.WriterBlockSize(32*1024))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMinlzWriter(w io.Writer) (io.WriteCloser, error) {
|
func newMinlzWriter(w io.Writer) (io.WriteCloser, error) {
|
||||||
m := minlzWriterPool.Get().(*minlz.Writer)
|
pool := compressionData[93].wpool
|
||||||
m.Reset(w)
|
cp := pool.Get()
|
||||||
return newWriterCompression(m, func() {
|
var z *minlz.Writer
|
||||||
m.Reset(nil)
|
if cp == nil {
|
||||||
minlzWriterPool.Put(m)
|
z = minlz.NewWriter(w, minlz.WriterBlockSize(32*1024))
|
||||||
|
} else {
|
||||||
|
z = cp.(*minlz.Writer)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
return newWriterCompression(z, func() {
|
||||||
|
z.Reset(nil)
|
||||||
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var minlzReaderPool = sync.Pool{
|
|
||||||
New: func() any {
|
|
||||||
return minlz.NewReader(nil, minlz.ReaderMaxBlockSize(32*1024))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func newMinlzReader(w io.Reader) (io.ReadCloser, error) {
|
func newMinlzReader(w io.Reader) (io.ReadCloser, error) {
|
||||||
m := minlzReaderPool.Get().(*minlz.Reader)
|
pool := compressionData[93].rpool
|
||||||
m.Reset(w)
|
cp := pool.Get()
|
||||||
return newReaderCompression(io.NopCloser(m), func() {
|
var z *minlz.Reader
|
||||||
m.Reset(nil)
|
if cp == nil {
|
||||||
minlzReaderPool.Put(m)
|
z = minlz.NewReader(w, minlz.ReaderMaxBlockSize(32*1024))
|
||||||
|
} else {
|
||||||
|
z = cp.(*minlz.Reader)
|
||||||
|
z.Reset(w)
|
||||||
|
}
|
||||||
|
return newReaderCompression(io.NopCloser(z), func() {
|
||||||
|
z.Reset(nil)
|
||||||
|
pool.Put(z)
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
|
|||||||
20
flate.go
20
flate.go
@@ -1,20 +0,0 @@
|
|||||||
package requests
|
|
||||||
|
|
||||||
// var flateWriterPool = sync.Pool{
|
|
||||||
// New: func() interface{} {
|
|
||||||
// w, _ := flate.NewWriter(io.Discard, flate.DefaultCompression)
|
|
||||||
// return w
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func getFlateWriter(dst io.Writer) *flate.Writer {
|
|
||||||
// w := flateWriterPool.Get().(*flate.Writer)
|
|
||||||
// w.Reset(dst)
|
|
||||||
// return w
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func putFlateWriter(w *flate.Writer) {
|
|
||||||
// // w.Close() // flush buffer
|
|
||||||
// w.Reset(io.Discard)
|
|
||||||
// flateWriterPool.Put(w)
|
|
||||||
// }
|
|
||||||
8
go.mod
8
go.mod
@@ -9,12 +9,12 @@ require (
|
|||||||
github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9
|
github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9
|
||||||
github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd
|
github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd
|
||||||
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a
|
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a
|
||||||
github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef
|
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d
|
||||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7
|
github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015
|
||||||
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686
|
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686
|
||||||
github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c
|
github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c
|
||||||
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c
|
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c
|
||||||
github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064
|
github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823
|
||||||
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9
|
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9
|
||||||
github.com/klauspost/compress v1.18.0
|
github.com/klauspost/compress v1.18.0
|
||||||
github.com/minio/minlz v1.0.1
|
github.com/minio/minlz v1.0.1
|
||||||
@@ -81,7 +81,7 @@ require (
|
|||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
go.uber.org/zap/exp v0.3.0 // indirect
|
go.uber.org/zap/exp v0.3.0 // indirect
|
||||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||||
golang.org/x/exp v0.0.0-20250808145144-a408d31f581a // indirect
|
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect
|
||||||
golang.org/x/image v0.30.0 // indirect
|
golang.org/x/image v0.30.0 // indirect
|
||||||
golang.org/x/mod v0.27.0 // indirect
|
golang.org/x/mod v0.27.0 // indirect
|
||||||
golang.org/x/sync v0.16.0 // indirect
|
golang.org/x/sync v0.16.0 // indirect
|
||||||
|
|||||||
16
go.sum
16
go.sum
@@ -114,10 +114,10 @@ github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd h1:aby4HnAGVJt5pI
|
|||||||
github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd/go.mod h1:GxCATDh+u/TLHTAI9p1kXfaGUkVNjHuY+Mhxdo4l5k8=
|
github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd/go.mod h1:GxCATDh+u/TLHTAI9p1kXfaGUkVNjHuY+Mhxdo4l5k8=
|
||||||
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a h1:FdBSNOy8cLM4WYkvWgQJVoi++OwkNtsipuRcxyb5d9Q=
|
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a h1:FdBSNOy8cLM4WYkvWgQJVoi++OwkNtsipuRcxyb5d9Q=
|
||||||
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a/go.mod h1:iTnRK0DU3YH7MlZZ9VdT5gQAFPKzHRtFi3EXpnosOAM=
|
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a/go.mod h1:iTnRK0DU3YH7MlZZ9VdT5gQAFPKzHRtFi3EXpnosOAM=
|
||||||
github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef h1:Ag8TrazSH1sVxVMjCOY3laRcorBiceseB3PcNvqJDbE=
|
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d h1:Yc8WmHlw6LMUz7AGOq9OmoZtj+yCFLpUZpACuRrKn4s=
|
||||||
github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef/go.mod h1:fnyx2omi7IYVdfKxfkAUR240Au/EKZ+HruhXw2EOrdg=
|
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d/go.mod h1:3dzikZkFrwB7IZVxAPikUjvlnArjxIREskI75fXpMW0=
|
||||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7 h1:o0S6ZZwnTrDwuDnRZkA0dIPsRuBe9vTlazb6+j/taR0=
|
github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015 h1:w4iI0F5Di8sfa0YPHBBqmEdbwh8AuSv5aUmoIcTDLgk=
|
||||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7/go.mod h1:9heGY5Ue/tgXRZWbPYjP7+0ccZcv+4FBH1gKANCy5Q4=
|
github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015/go.mod h1:YgO4bbAuSaSLzLeugPzEplsQ649pv/GsahWLiWRARBg=
|
||||||
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686 h1:1DgqAbiUoZueBEO4Ti5uqqKE60SagebEzKNh1tzpWcI=
|
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686 h1:1DgqAbiUoZueBEO4Ti5uqqKE60SagebEzKNh1tzpWcI=
|
||||||
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686/go.mod h1:g5v7nxLoHAXT5FMbU+m2Q43oiNiAp0MDdcI+lqb2+vs=
|
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686/go.mod h1:g5v7nxLoHAXT5FMbU+m2Q43oiNiAp0MDdcI+lqb2+vs=
|
||||||
github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c h1:Ksw8S50iGK0dqYmScPRn/oOuKegHJ2j9DupSURZZmoI=
|
github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c h1:Ksw8S50iGK0dqYmScPRn/oOuKegHJ2j9DupSURZZmoI=
|
||||||
@@ -126,8 +126,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/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 h1:8/Cf+c2680tkWJ+ueZ9RLLK5R5R8nhE8pNBUPHjkvkM=
|
||||||
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c/go.mod h1:dd8aDIUG1vDPP5r+vHBtiUK0Zn6uk3SsWt1ZvmCCHLs=
|
github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c/go.mod h1:dd8aDIUG1vDPP5r+vHBtiUK0Zn6uk3SsWt1ZvmCCHLs=
|
||||||
github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064 h1:zmdLFUzG87xgpDp6JnTr73t1f+LtOLufiL7dPT2nPVQ=
|
github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823 h1:ZjQlAF1MyaX3gLwJy3sfiS3p90nlaQ7gGlEimBX/Nws=
|
||||||
github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064/go.mod h1:i0V5k/zJW/ghTLLWY40pwTVuwa/Gxm2Q1IP1vQYHBX8=
|
github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823/go.mod h1:49t4VTyJasJTs7SR2SyhkXkB7VctL9VE1TCY10fqlH0=
|
||||||
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9 h1:wr8I0a7B39o4TsKthOlA/hKeCkKntToIxyRsEqbcmDo=
|
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9 h1:wr8I0a7B39o4TsKthOlA/hKeCkKntToIxyRsEqbcmDo=
|
||||||
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9/go.mod h1:tV+/Xly2dOtGs8J5FfJRKD8NA5YTkVe78uKytVuhs58=
|
github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9/go.mod h1:tV+/Xly2dOtGs8J5FfJRKD8NA5YTkVe78uKytVuhs58=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
@@ -285,8 +285,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-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-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-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20250808145144-a408d31f581a h1:Y+7uR/b1Mw2iSXZ3G//1haIiSElDQZ8KWh0h+sZPG90=
|
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
|
||||||
golang.org/x/exp v0.0.0-20250808145144-a408d31f581a/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
|
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
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.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4=
|
golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4=
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ func (obj *Response) WebSocket() *websocket.Conn {
|
|||||||
if obj.StatusCode() != 101 {
|
if obj.StatusCode() != 101 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
obj.webSocket = websocket.NewConn(newFakeConn(obj.rawBody.Stream()), func() { obj.CloseConn() }, true, obj.Headers().Get("Sec-WebSocket-Extensions"))
|
obj.webSocket = websocket.NewConn(newFakeConn(obj.rawBody.Stream()), true, obj.Headers().Get("Sec-WebSocket-Extensions"))
|
||||||
return obj.webSocket
|
return obj.webSocket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -132,17 +132,7 @@ func (obj *roundTripper) ghttp3Dial(ctx *Response, remoteAddress Address, proxyA
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
conn = http3.NewConn(obj.ctx, netConn, udpConn)
|
||||||
conn = http3.NewConn(cctx, netConn, udpConn, func() {
|
|
||||||
ccnl(errors.New("http3 client close"))
|
|
||||||
})
|
|
||||||
if ct, ok := udpConn.(interface {
|
|
||||||
SetTcpCloseFunc(f func(error))
|
|
||||||
}); ok {
|
|
||||||
ct.SetTcpCloseFunc(func(err error) {
|
|
||||||
ccnl(errors.New("http3 client close with udp"))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,17 +172,7 @@ func (obj *roundTripper) uhttp3Dial(ctx *Response, remoteAddress Address, proxyA
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
conn = http3.NewConn(obj.ctx, netConn, udpConn)
|
||||||
conn = http3.NewConn(cctx, netConn, udpConn, func() {
|
|
||||||
ccnl(errors.New("http3 client close"))
|
|
||||||
})
|
|
||||||
if ct, ok := udpConn.(interface {
|
|
||||||
SetTcpCloseFunc(f func(error))
|
|
||||||
}); ok {
|
|
||||||
ct.SetTcpCloseFunc(func(err error) {
|
|
||||||
ccnl(errors.New("uhttp3 client close with udp"))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,19 +250,14 @@ func (obj *roundTripper) dial(ctx *Response) (conn http1.Conn, err error) {
|
|||||||
return obj.dialConnecotr(ctx, rawConn, h2)
|
return obj.dialConnecotr(ctx, rawConn, h2)
|
||||||
}
|
}
|
||||||
func (obj *roundTripper) dialConnecotr(ctx *Response, rawCon net.Conn, h2 bool) (conn http1.Conn, err error) {
|
func (obj *roundTripper) dialConnecotr(ctx *Response, rawCon net.Conn, h2 bool) (conn http1.Conn, err error) {
|
||||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
|
||||||
if h2 {
|
if h2 {
|
||||||
var spec *http2.Spec
|
var spec *http2.Spec
|
||||||
if ctx.option.gospiderSpec != nil {
|
if ctx.option.gospiderSpec != nil {
|
||||||
spec = ctx.option.gospiderSpec.H2Spec
|
spec = ctx.option.gospiderSpec.H2Spec
|
||||||
}
|
}
|
||||||
conn, err = http2.NewConn(cctx, ctx.Context(), rawCon, spec, func(err error) {
|
conn, err = http2.NewConn(obj.ctx, ctx.Context(), rawCon, spec)
|
||||||
ccnl(tools.WrapError(err, "http2 client close"))
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
conn = http1.NewConn(cctx, rawCon, func(err error) {
|
conn = http1.NewConn(obj.ctx, rawCon)
|
||||||
ccnl(tools.WrapError(err, "http1 client close"))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
10
socks5.go
10
socks5.go
@@ -101,7 +101,6 @@ type UDPConn struct {
|
|||||||
bufWrite [MaxUdpPacket]byte
|
bufWrite [MaxUdpPacket]byte
|
||||||
proxyAddress net.Addr
|
proxyAddress net.Addr
|
||||||
remoteAddress Address
|
remoteAddress Address
|
||||||
tcpCloseFunc func(error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUDPConn(tcpConn net.Conn, packConn net.PacketConn, proxyAddress net.Addr, remoteAddress Address) *UDPConn {
|
func NewUDPConn(tcpConn net.Conn, packConn net.PacketConn, proxyAddress net.Addr, remoteAddress Address) *UDPConn {
|
||||||
@@ -113,10 +112,8 @@ func NewUDPConn(tcpConn net.Conn, packConn net.PacketConn, proxyAddress net.Addr
|
|||||||
prefix: []byte{0, 0, 0},
|
prefix: []byte{0, 0, 0},
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
_, err := tools.Copy(io.Discard, tcpConn)
|
tools.Copy(io.Discard, tcpConn)
|
||||||
if ucon.tcpCloseFunc != nil {
|
ucon.Close()
|
||||||
ucon.tcpCloseFunc(err)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
return ucon
|
return ucon
|
||||||
}
|
}
|
||||||
@@ -173,9 +170,6 @@ func (c *UDPConn) SetWriteBuffer(i int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *UDPConn) SetTcpCloseFunc(f func(error)) {
|
|
||||||
c.tcpCloseFunc = f
|
|
||||||
}
|
|
||||||
func (c *UDPConn) Close() error {
|
func (c *UDPConn) Close() error {
|
||||||
c.tcpConn.Close()
|
c.tcpConn.Close()
|
||||||
return c.PacketConn.Close()
|
return c.PacketConn.Close()
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
func TestSse(t *testing.T) {
|
func TestSse(t *testing.T) {
|
||||||
// Start the server
|
// Start the server
|
||||||
go func() {
|
go func() {
|
||||||
err := http.ListenAndServe(":3333", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
err := http.ListenAndServe(":3334", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Header().Set("Content-Type", "text/event-stream")
|
w.Header().Set("Content-Type", "text/event-stream")
|
||||||
w.Header().Set("Cache-Control", "no-cache")
|
w.Header().Set("Cache-Control", "no-cache")
|
||||||
w.Header().Set("Connection", "keep-alive")
|
w.Header().Set("Connection", "keep-alive")
|
||||||
@@ -47,7 +47,7 @@ func TestSse(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
time.Sleep(time.Second * 3)
|
time.Sleep(time.Second * 3)
|
||||||
response, err := requests.Get(nil, "http://127.0.0.1:3333/events") // Send WebSocket request
|
response, err := requests.Get(nil, "http://127.0.0.1:3334/events") // Send WebSocket request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,38 +14,38 @@ import (
|
|||||||
|
|
||||||
var wsOk bool
|
var wsOk bool
|
||||||
|
|
||||||
func websocketServer() {
|
func websocketServer(addr string) {
|
||||||
if wsOk {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var upgrader = websocket.Upgrader{
|
var upgrader = websocket.Upgrader{
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
CheckOrigin: func(r *http.Request) bool {
|
||||||
return true // 允许跨域
|
return true // 允许跨域
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
|
if !wsOk {
|
||||||
conn, err := upgrader.Upgrade(w, r, nil)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer conn.Close()
|
|
||||||
|
|
||||||
for {
|
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
|
||||||
messageType, message, err := conn.ReadMessage()
|
conn, err := upgrader.Upgrade(w, r, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
return
|
||||||
}
|
}
|
||||||
conn.WriteMessage(messageType, []byte("服务端回复:"+string(message)))
|
defer conn.Close()
|
||||||
}
|
|
||||||
})
|
for {
|
||||||
log.Println("WebSocket 服务器启动于 ws://localhost:8080/ws")
|
messageType, message, err := conn.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
conn.WriteMessage(messageType, []byte("服务端回复:"+string(message)))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
wsOk = true
|
wsOk = true
|
||||||
log.Fatal(http.ListenAndServe(":8800", nil))
|
log.Printf("WebSocket 服务器启动于 ws://127.0.0.1%s/ws", addr)
|
||||||
|
log.Fatal(http.ListenAndServe(addr, nil))
|
||||||
}
|
}
|
||||||
func TestWebSocket(t *testing.T) {
|
func TestWebSocket(t *testing.T) {
|
||||||
go websocketServer()
|
go websocketServer(":8806")
|
||||||
time.Sleep(time.Second * 1) // Send WebSocket request
|
time.Sleep(time.Second * 1) // Send WebSocket request
|
||||||
response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true}) // Send WebSocket request
|
response, err := requests.Get(nil, "ws://127.0.0.1:8806/ws", requests.RequestOption{DisProxy: true}) // Send WebSocket request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
@@ -80,9 +80,10 @@ func TestWebSocket(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func TestWebSocketClose(t *testing.T) {
|
func TestWebSocketClose(t *testing.T) {
|
||||||
go websocketServer()
|
time.Sleep(time.Second * 1) // Send WebSocket request
|
||||||
time.Sleep(time.Second * 1) // Send WebSocket request
|
go websocketServer(":8809")
|
||||||
response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
time.Sleep(time.Second * 5) // Send WebSocket request
|
||||||
|
response, err := requests.Get(nil, "ws://127.0.0.1:8809/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
@@ -101,9 +102,9 @@ func TestWebSocketClose(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func TestWebSocketClose2(t *testing.T) {
|
func TestWebSocketClose2(t *testing.T) {
|
||||||
go websocketServer()
|
go websocketServer(":8802")
|
||||||
time.Sleep(time.Second * 1) // Send WebSocket request
|
time.Sleep(time.Second * 1) // Send WebSocket request
|
||||||
response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
response, err := requests.Get(nil, "ws://127.0.0.1:8802/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
@@ -124,9 +125,9 @@ func TestWebSocketClose2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func TestWebSocketClose3(t *testing.T) {
|
func TestWebSocketClose3(t *testing.T) {
|
||||||
go websocketServer()
|
go websocketServer(":8803")
|
||||||
time.Sleep(time.Second * 1) // Send WebSocket request
|
time.Sleep(time.Second * 1) // Send WebSocket request
|
||||||
response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
response, err := requests.Get(nil, "ws://127.0.0.1:8803/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user