This commit is contained in:
gospider
2025-08-13 10:55:40 +08:00
parent 61790deab6
commit 31ac1d77ca
10 changed files with 202 additions and 211 deletions

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
View File

@@ -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
View File

@@ -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=

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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()

View File

@@ -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)
}

View File

@@ -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)
}