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) {
|
||||
c, ok := compressionData[b]
|
||||
if !ok {
|
||||
@@ -106,7 +83,7 @@ func NewCompressionWithByte(b byte) (Compression, error) {
|
||||
func NewCompression(decode string) (Compression, error) {
|
||||
decode = strings.ToLower(decode)
|
||||
for b, c := range compressionData {
|
||||
if c.String() == decode {
|
||||
if c.name == decode {
|
||||
return NewCompressionWithByte(b)
|
||||
}
|
||||
}
|
||||
@@ -140,7 +117,10 @@ func (obj *CompressionConn) Write(b []byte) (n int, err error) {
|
||||
return obj.w.Write(b)
|
||||
}
|
||||
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 {
|
||||
|
||||
@@ -10,130 +10,191 @@ import (
|
||||
"github.com/minio/minlz"
|
||||
)
|
||||
|
||||
// zstd pool
|
||||
var zstdWriterPool = sync.Pool{
|
||||
New: func() any {
|
||||
c, _ := zstd.NewWriter(nil, zstd.WithWindowSize(32*1024))
|
||||
return c
|
||||
},
|
||||
type compreData struct {
|
||||
rpool *sync.Pool
|
||||
wpool *sync.Pool
|
||||
name string
|
||||
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) {
|
||||
z := zstdWriterPool.Get().(*zstd.Encoder)
|
||||
z.Reset(w)
|
||||
pool := compressionData[40].wpool
|
||||
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() {
|
||||
z.Reset(nil)
|
||||
zstdWriterPool.Put(z)
|
||||
pool.Put(z)
|
||||
}), nil
|
||||
}
|
||||
|
||||
var zstdReaderPool = sync.Pool{
|
||||
New: func() any {
|
||||
w, _ := zstd.NewReader(nil)
|
||||
return w
|
||||
},
|
||||
}
|
||||
|
||||
func newZstdReader(w io.Reader) (io.ReadCloser, error) {
|
||||
z := zstdReaderPool.Get().(*zstd.Decoder)
|
||||
z.Reset(w)
|
||||
pool := compressionData[40].rpool
|
||||
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() {
|
||||
z.Reset(nil)
|
||||
zstdReaderPool.Put(z)
|
||||
pool.Put(z)
|
||||
}), nil
|
||||
}
|
||||
|
||||
// snappy pool
|
||||
var snappyWriterPool = sync.Pool{
|
||||
New: func() any {
|
||||
return snappy.NewBufferedWriter(nil)
|
||||
},
|
||||
}
|
||||
|
||||
func newSnappyWriter(w io.Writer) (io.WriteCloser, error) {
|
||||
s := snappyWriterPool.Get().(*snappy.Writer)
|
||||
s.Reset(w)
|
||||
return newWriterCompression(s, func() {
|
||||
s.Reset(nil)
|
||||
snappyWriterPool.Put(s)
|
||||
pool := compressionData[255].wpool
|
||||
cp := pool.Get()
|
||||
var z *snappy.Writer
|
||||
if cp == nil {
|
||||
z = snappy.NewBufferedWriter(w)
|
||||
} else {
|
||||
z = cp.(*snappy.Writer)
|
||||
z.Reset(w)
|
||||
}
|
||||
return newWriterCompression(z, func() {
|
||||
z.Reset(nil)
|
||||
pool.Put(z)
|
||||
}), nil
|
||||
}
|
||||
|
||||
var snappyReaderPool = sync.Pool{
|
||||
New: func() any {
|
||||
return snappy.NewReader(nil)
|
||||
},
|
||||
}
|
||||
|
||||
func newSnappyReader(w io.Reader) (io.ReadCloser, error) {
|
||||
s := snappyReaderPool.Get().(*snappy.Reader)
|
||||
s.Reset(w)
|
||||
return newReaderCompression(io.NopCloser(s), func() {
|
||||
s.Reset(nil)
|
||||
snappyReaderPool.Put(s)
|
||||
pool := compressionData[255].rpool
|
||||
cp := pool.Get()
|
||||
var z *snappy.Reader
|
||||
if cp == nil {
|
||||
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
|
||||
}
|
||||
|
||||
// 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) {
|
||||
f := flateWriterPool.Get().(*flate.Writer)
|
||||
f.Reset(w)
|
||||
return newWriterCompression(f, func() {
|
||||
f.Reset(nil)
|
||||
flateWriterPool.Put(f)
|
||||
pool := compressionData[92].wpool
|
||||
cp := pool.Get()
|
||||
var z *flate.Writer
|
||||
var err error
|
||||
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
|
||||
}
|
||||
|
||||
var flateReaderPool = sync.Pool{
|
||||
New: func() any {
|
||||
return flate.NewReader(nil)
|
||||
},
|
||||
}
|
||||
|
||||
func newFlateReader(w io.Reader) (io.ReadCloser, error) {
|
||||
r := flateReaderPool.Get().(io.ReadCloser)
|
||||
f := r.(flate.Resetter)
|
||||
err := f.Reset(w, nil)
|
||||
return newReaderCompression(r, func() {
|
||||
pool := compressionData[92].rpool
|
||||
cp := pool.Get()
|
||||
var z io.ReadCloser
|
||||
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)
|
||||
flateReaderPool.Put(r)
|
||||
}), err
|
||||
pool.Put(z)
|
||||
}), nil
|
||||
}
|
||||
|
||||
// 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) {
|
||||
m := minlzWriterPool.Get().(*minlz.Writer)
|
||||
m.Reset(w)
|
||||
return newWriterCompression(m, func() {
|
||||
m.Reset(nil)
|
||||
minlzWriterPool.Put(m)
|
||||
pool := compressionData[93].wpool
|
||||
cp := pool.Get()
|
||||
var z *minlz.Writer
|
||||
if cp == nil {
|
||||
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
|
||||
}
|
||||
|
||||
var minlzReaderPool = sync.Pool{
|
||||
New: func() any {
|
||||
return minlz.NewReader(nil, minlz.ReaderMaxBlockSize(32*1024))
|
||||
},
|
||||
}
|
||||
|
||||
func newMinlzReader(w io.Reader) (io.ReadCloser, error) {
|
||||
m := minlzReaderPool.Get().(*minlz.Reader)
|
||||
m.Reset(w)
|
||||
return newReaderCompression(io.NopCloser(m), func() {
|
||||
m.Reset(nil)
|
||||
minlzReaderPool.Put(m)
|
||||
pool := compressionData[93].rpool
|
||||
cp := pool.Get()
|
||||
var z *minlz.Reader
|
||||
if cp == nil {
|
||||
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
|
||||
}
|
||||
|
||||
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/gson v0.0.0-20250718004537-ff15820964bd
|
||||
github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a
|
||||
github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef
|
||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7
|
||||
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d
|
||||
github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015
|
||||
github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686
|
||||
github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c
|
||||
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/klauspost/compress v1.18.0
|
||||
github.com/minio/minlz v1.0.1
|
||||
@@ -81,7 +81,7 @@ require (
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
go.uber.org/zap/exp v0.3.0 // 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/mod v0.27.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/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/http1 v0.0.0-20250806001143-d0669acd99ef h1:Ag8TrazSH1sVxVMjCOY3laRcorBiceseB3PcNvqJDbE=
|
||||
github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef/go.mod h1:fnyx2omi7IYVdfKxfkAUR240Au/EKZ+HruhXw2EOrdg=
|
||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7 h1:o0S6ZZwnTrDwuDnRZkA0dIPsRuBe9vTlazb6+j/taR0=
|
||||
github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7/go.mod h1:9heGY5Ue/tgXRZWbPYjP7+0ccZcv+4FBH1gKANCy5Q4=
|
||||
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d h1:Yc8WmHlw6LMUz7AGOq9OmoZtj+yCFLpUZpACuRrKn4s=
|
||||
github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d/go.mod h1:3dzikZkFrwB7IZVxAPikUjvlnArjxIREskI75fXpMW0=
|
||||
github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015 h1:w4iI0F5Di8sfa0YPHBBqmEdbwh8AuSv5aUmoIcTDLgk=
|
||||
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/go.mod h1:g5v7nxLoHAXT5FMbU+m2Q43oiNiAp0MDdcI+lqb2+vs=
|
||||
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/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-20250730001814-2c13a4717064 h1:zmdLFUzG87xgpDp6JnTr73t1f+LtOLufiL7dPT2nPVQ=
|
||||
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 h1:ZjQlAF1MyaX3gLwJy3sfiS3p90nlaQ7gGlEimBX/Nws=
|
||||
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/go.mod h1:tV+/Xly2dOtGs8J5FfJRKD8NA5YTkVe78uKytVuhs58=
|
||||
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-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-20250808145144-a408d31f581a h1:Y+7uR/b1Mw2iSXZ3G//1haIiSElDQZ8KWh0h+sZPG90=
|
||||
golang.org/x/exp v0.0.0-20250808145144-a408d31f581a/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
|
||||
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
|
||||
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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4=
|
||||
|
||||
@@ -158,7 +158,7 @@ func (obj *Response) WebSocket() *websocket.Conn {
|
||||
if obj.StatusCode() != 101 {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -132,17 +132,7 @@ func (obj *roundTripper) ghttp3Dial(ctx *Response, remoteAddress Address, proxyA
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
||||
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"))
|
||||
})
|
||||
}
|
||||
conn = http3.NewConn(obj.ctx, netConn, udpConn)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -182,17 +172,7 @@ func (obj *roundTripper) uhttp3Dial(ctx *Response, remoteAddress Address, proxyA
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
||||
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"))
|
||||
})
|
||||
}
|
||||
conn = http3.NewConn(obj.ctx, netConn, udpConn)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -270,19 +250,14 @@ func (obj *roundTripper) dial(ctx *Response) (conn http1.Conn, err error) {
|
||||
return obj.dialConnecotr(ctx, rawConn, h2)
|
||||
}
|
||||
func (obj *roundTripper) dialConnecotr(ctx *Response, rawCon net.Conn, h2 bool) (conn http1.Conn, err error) {
|
||||
cctx, ccnl := context.WithCancelCause(obj.ctx)
|
||||
if h2 {
|
||||
var spec *http2.Spec
|
||||
if ctx.option.gospiderSpec != nil {
|
||||
spec = ctx.option.gospiderSpec.H2Spec
|
||||
}
|
||||
conn, err = http2.NewConn(cctx, ctx.Context(), rawCon, spec, func(err error) {
|
||||
ccnl(tools.WrapError(err, "http2 client close"))
|
||||
})
|
||||
conn, err = http2.NewConn(obj.ctx, ctx.Context(), rawCon, spec)
|
||||
} else {
|
||||
conn = http1.NewConn(cctx, rawCon, func(err error) {
|
||||
ccnl(tools.WrapError(err, "http1 client close"))
|
||||
})
|
||||
conn = http1.NewConn(obj.ctx, rawCon)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
10
socks5.go
10
socks5.go
@@ -101,7 +101,6 @@ type UDPConn struct {
|
||||
bufWrite [MaxUdpPacket]byte
|
||||
proxyAddress net.Addr
|
||||
remoteAddress Address
|
||||
tcpCloseFunc func(error)
|
||||
}
|
||||
|
||||
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},
|
||||
}
|
||||
go func() {
|
||||
_, err := tools.Copy(io.Discard, tcpConn)
|
||||
if ucon.tcpCloseFunc != nil {
|
||||
ucon.tcpCloseFunc(err)
|
||||
}
|
||||
tools.Copy(io.Discard, tcpConn)
|
||||
ucon.Close()
|
||||
}()
|
||||
return ucon
|
||||
}
|
||||
@@ -173,9 +170,6 @@ func (c *UDPConn) SetWriteBuffer(i int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *UDPConn) SetTcpCloseFunc(f func(error)) {
|
||||
c.tcpCloseFunc = f
|
||||
}
|
||||
func (c *UDPConn) Close() error {
|
||||
c.tcpConn.Close()
|
||||
return c.PacketConn.Close()
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
func TestSse(t *testing.T) {
|
||||
// Start the server
|
||||
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("Cache-Control", "no-cache")
|
||||
w.Header().Set("Connection", "keep-alive")
|
||||
@@ -47,7 +47,7 @@ func TestSse(t *testing.T) {
|
||||
}
|
||||
}()
|
||||
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 {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
@@ -14,38 +14,38 @@ import (
|
||||
|
||||
var wsOk bool
|
||||
|
||||
func websocketServer() {
|
||||
if wsOk {
|
||||
return
|
||||
}
|
||||
func websocketServer(addr string) {
|
||||
var upgrader = websocket.Upgrader{
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true // 允许跨域
|
||||
},
|
||||
}
|
||||
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer conn.Close()
|
||||
if !wsOk {
|
||||
|
||||
for {
|
||||
messageType, message, err := conn.ReadMessage()
|
||||
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
break
|
||||
return
|
||||
}
|
||||
conn.WriteMessage(messageType, []byte("服务端回复:"+string(message)))
|
||||
}
|
||||
})
|
||||
log.Println("WebSocket 服务器启动于 ws://localhost:8080/ws")
|
||||
defer conn.Close()
|
||||
|
||||
for {
|
||||
messageType, message, err := conn.ReadMessage()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
conn.WriteMessage(messageType, []byte("服务端回复:"+string(message)))
|
||||
}
|
||||
})
|
||||
}
|
||||
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) {
|
||||
go websocketServer()
|
||||
go websocketServer(":8806")
|
||||
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 {
|
||||
log.Panic(err)
|
||||
}
|
||||
@@ -80,9 +80,10 @@ func TestWebSocket(t *testing.T) {
|
||||
}
|
||||
}
|
||||
func TestWebSocketClose(t *testing.T) {
|
||||
go websocketServer()
|
||||
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
|
||||
time.Sleep(time.Second * 1) // Send WebSocket request
|
||||
go websocketServer(":8809")
|
||||
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 {
|
||||
log.Panic(err)
|
||||
}
|
||||
@@ -101,9 +102,9 @@ func TestWebSocketClose(t *testing.T) {
|
||||
}
|
||||
}
|
||||
func TestWebSocketClose2(t *testing.T) {
|
||||
go websocketServer()
|
||||
go websocketServer(":8802")
|
||||
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 {
|
||||
log.Panic(err)
|
||||
}
|
||||
@@ -124,9 +125,9 @@ func TestWebSocketClose2(t *testing.T) {
|
||||
}
|
||||
}
|
||||
func TestWebSocketClose3(t *testing.T) {
|
||||
go websocketServer()
|
||||
go websocketServer(":8803")
|
||||
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 {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user