From d48a74685e113ac1115d86e9704045e952f34112 Mon Sep 17 00:00:00 2001 From: newacorn Date: Sun, 20 Oct 2024 10:21:00 +0800 Subject: [PATCH] update dependency --- .gitignore | 3 +- brio_stream_bench_test.go | 4 +- brotli.go | 6 +-- client.go | 6 +-- client_cleaner.go | 4 +- client_test.go | 44 +-------------------- compress.go | 2 +- fs.go | 15 +++----- fs.go.fasthttp.zst | Bin 17363 -> 17351 bytes fs_test.go | 2 +- fs_v3.go | 4 +- go.mod | 24 ++++++++---- go.sum | 79 +++++++++++++++++++++++++++++--------- header.go | 2 +- http.go | 2 +- server.go | 6 +-- supplement.go | 2 +- supplement_compress.go | 7 ++-- time_test.go | 4 +- tmp_test.go | 2 +- uri.go | 6 +-- zstd.go | 2 +- 22 files changed, 116 insertions(+), 110 deletions(-) diff --git a/.gitignore b/.gitignore index 6855405a24..ba1f773f66 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,4 @@ tags .vscode .DS_Store vendor/ -testdata/fuzz -testdata2/cantAccess +testdata/fuzz \ No newline at end of file diff --git a/brio_stream_bench_test.go b/brio_stream_bench_test.go index d33ccac0ce..14bb7933ca 100644 --- a/brio_stream_bench_test.go +++ b/brio_stream_bench_test.go @@ -5,16 +5,16 @@ import ( gbytes "bytes" "compress/gzip" "fmt" - "github.com/andybalholm/brotli" "github.com/gookit/goutil/testutil/assert" + "github.com/newacorn/brotli" "github.com/newacorn/goutils/bytes" + "github.com/newacorn/goutils/compress" bpool "github.com/newacorn/simple-bytes-pool" "github.com/xyproto/randomstring" "io" "log" "strconv" "testing" - "utils/compress" ) func BenchmarkBodyCompress(b *testing.B) { diff --git a/brotli.go b/brotli.go index 0308e7ac06..7a989569b0 100644 --- a/brotli.go +++ b/brotli.go @@ -3,12 +3,12 @@ package fasthttp import ( "bytes" "fmt" - "github.com/google/brotli/go/cbrotli" + "github.com/newacorn/cbrotli/go/cbrotli" + ucompress "github.com/newacorn/goutils/compress" "io" "sync" - ucompress "utils/compress" - "github.com/andybalholm/brotli" + "github.com/newacorn/brotli" "github.com/valyala/bytebufferpool" "github.com/valyala/fasthttp/stackless" ) diff --git a/client.go b/client.go index fdcd9cb2a4..b62fe0f860 100644 --- a/client.go +++ b/client.go @@ -438,7 +438,7 @@ func (c *Client) createHostClient(host string, isTLS bool) (hc *HostClient, err if c.MaxIdleConnDuration == 0 { du = DefaultMaxIdleConnDuration } - RegisterCleanableItem(c, du) + registerCleanableItem(c, du) c.cleanStart = true } if c.ConfigureClient != nil { @@ -472,7 +472,7 @@ func (c *Client) AddHostClient(host string, hc *HostClient) { if du == 0 { du = DefaultMaxIdleConnDuration } - RegisterCleanableItem(c, du) + registerCleanableItem(c, du) c.cleanStart = true } c.mLock.Unlock() @@ -1529,7 +1529,7 @@ func (c *HostClient) acquireConn(dialTimeout, writeTimeout time.Duration, connec c.connsCount++ createConn = true if !c.connsCleanerRun && !connectionClose && c.maxIdleConnDuration > 0 { - RegisterCleanableItem(c, c.maxIdleConnDuration) + registerCleanableItem(c, c.maxIdleConnDuration) c.connsCleanerRun = true } } diff --git a/client_cleaner.go b/client_cleaner.go index 1a046b8bea..6dff982516 100644 --- a/client_cleaner.go +++ b/client_cleaner.go @@ -15,10 +15,10 @@ var defaultClientCleaner = DurationCleaner{ minDuration: time.Millisecond * 500, } -func RegisterCleanableItem(client CleanableItem, duration time.Duration) { +func registerCleanableItem(client CleanableItem, duration time.Duration) { defaultClientCleaner.Register(client, duration) } -func StopDurationCleaner() { +func stopDurationCleaner() { defaultClientCleaner.Stop() } diff --git a/client_test.go b/client_test.go index 5aae6e4449..b74979debd 100644 --- a/client_test.go +++ b/client_test.go @@ -6,7 +6,8 @@ import ( "crypto/tls" "errors" "fmt" - "golang.org/x/text/encoding/simplifiedchinese" + "github.com/newacorn/goutils/compress" + "github.com/valyala/fasthttp/fasthttputil" "io" "net" "net/http" @@ -20,10 +21,6 @@ import ( "syscall" "testing" "time" - "utils/compress" - "utils/transform" - - "github.com/valyala/fasthttp/fasthttputil" ) func newDialHelper(dial func(addr string) (net.Conn, error)) Dialer { @@ -3891,43 +3888,6 @@ func TestHostClientRedirect(t *testing.T) { } } -func Test(t *testing.T) { - t.Skip() - var cli Client - req := AcquireRequest() - resp := AcquireResponse() - defer func() { - ReleaseRequest(req) - ReleaseResponse(resp) - }() - reqURL := `https://www.jxjyedu.org.cn/student/chapterlist.jsp?id=202372&idle=55` - req.SetRequestURI(reqURL) - err := cli.Do(req, resp) - if err != nil { - t.Fatal(err) - } - en := resp.Header.Peek(HeaderContentEncoding) - body := resp.Body() - if len(en) > 0 { - err, br := DecodeEncoding(bytes.NewReader(body), b2s(en)) - if err != nil { - t.Fatal(err) - } - body, err = io.ReadAll(br) - if err != nil { - t.Fatal(err) - } - } - ch := resp.Header.Charset() - if b2s(ch) == CharsetGBK { - r := transform.NewReader(bytes.NewReader(resp.Body()), simplifiedchinese.GBK.NewDecoder()) - body, err = ReadAll(r) - if err != nil { - t.Fatal(err) - } - } -} - func DecodeEncoding(r io.Reader, encoding string) (err error, br io.Reader) { var rr compress.ReadResetCloser switch encoding { diff --git a/compress.go b/compress.go index 4632ef2819..0b5a7e3ed0 100644 --- a/compress.go +++ b/compress.go @@ -3,10 +3,10 @@ package fasthttp import ( "bytes" "fmt" + ucompress "github.com/newacorn/goutils/compress" "io" "io/fs" "sync" - ucompress "utils/compress" "github.com/klauspost/compress/flate" "github.com/klauspost/compress/gzip" diff --git a/fs.go b/fs.go index d8e547fdfd..f81dd99f2f 100644 --- a/fs.go +++ b/fs.go @@ -6,9 +6,15 @@ import ( "bytes" "errors" "fmt" + "github.com/klauspost/compress/gzip" + "github.com/klauspost/compress/zstd" + "github.com/newacorn/brotli" pbytes "github.com/newacorn/goutils/bytes" + "github.com/newacorn/goutils/compress" + "github.com/newacorn/goutils/http" pool "github.com/newacorn/simple-bytes-pool" "github.com/puzpuzpuz/xsync/v3" + "github.com/valyala/bytebufferpool" "html" "io" "io/fs" @@ -22,15 +28,6 @@ import ( "sync/atomic" "time" "unsafe" - "utils/compress" - "utils/http" - - //"utils/http" - - "github.com/andybalholm/brotli" - "github.com/klauspost/compress/gzip" - "github.com/klauspost/compress/zstd" - "github.com/valyala/bytebufferpool" ) // ServeFileBytesUncompressed returns HTTP response containing file contents diff --git a/fs.go.fasthttp.zst b/fs.go.fasthttp.zst index 57c463a7cbabc23aaf18fec0e6bcc87b7538c2db..d833ee18405eb0cccefbc796ce2fa10d7589e830 100644 GIT binary patch literal 17351 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 yWaLN&-RH1kgz$Y?2u*$0-DWWEWiWPr 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 I0rMWSz33)uF8}}l diff --git a/fs_test.go b/fs_test.go index 26f7c55ae1..7d3e73e3bb 100644 --- a/fs_test.go +++ b/fs_test.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "github.com/gookit/goutil/testutil/assert" + "github.com/newacorn/goutils/compress" "github.com/puzpuzpuz/xsync/v3" "github.com/valyala/fasthttp" "github.com/valyala/fasthttp/fasthttputil" @@ -20,7 +21,6 @@ import ( "testing" "time" "unicode/utf8" - "utils/compress" ) type TestLogger struct { diff --git a/fs_v3.go b/fs_v3.go index 43de0238f1..58b3ed7c6a 100644 --- a/fs_v3.go +++ b/fs_v3.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" pbytes "github.com/newacorn/goutils/bytes" + "github.com/newacorn/goutils/compress" + "github.com/newacorn/goutils/http" pool "github.com/newacorn/simple-bytes-pool" "github.com/puzpuzpuz/xsync/v3" "html" @@ -19,8 +21,6 @@ import ( "sync/atomic" "time" "unsafe" - "utils/compress" - "utils/http" ) // MaxSmallFileSize Files bigger than this size are sent with sendfile. diff --git a/go.mod b/go.mod index b2dfdee52c..a779a6494a 100644 --- a/go.mod +++ b/go.mod @@ -5,23 +5,33 @@ go 1.22.5 toolchain go1.22.6 require ( - github.com/andybalholm/brotli v1.1.0 + github.com/andybalholm/brotli v1.1.1 + github.com/bytedance/gopkg v0.1.1 + github.com/google/brotli/go/cbrotli v0.0.0-20240715182736-39bcecf4559f github.com/gookit/goutil v0.6.17 - github.com/klauspost/compress v1.17.9 + github.com/klauspost/compress v1.17.11 + github.com/newacorn/goutils v0.0.0-20241020013356-15e1e4834c16 + github.com/newacorn/simple-bytes-pool v0.0.0-20241019202108-1ca97a547e01 github.com/pkg/errors v0.9.1 + github.com/puzpuzpuz/xsync/v3 v3.4.0 + github.com/rs/zerolog v1.33.0 github.com/valyala/bytebufferpool v1.0.0 github.com/valyala/fasthttp v1.55.0 github.com/valyala/tcplisten v1.0.0 + github.com/xyproto/randomstring v1.0.5 golang.org/x/crypto v0.25.0 golang.org/x/net v0.27.0 - golang.org/x/sys v0.25.0 + golang.org/x/sys v0.26.0 + golang.org/x/text v0.18.0 ) +replace github.com/klauspost/compress v1.17.11 => github.com/newacorn/compress v0.0.0-20241020002001-be411bf4ca21 + require ( - github.com/google/brotli/go/cbrotli v0.0.0-20240715182736-39bcecf4559f // indirect github.com/gookit/color v1.5.4 // indirect - github.com/newacorn/goutils v0.0.0-20241019181402-f6ad1a3f638b // indirect - github.com/newacorn/simple-bytes-pool v0.0.0-20241019181444-92b43ac0f160 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/newacorn/brotli v0.0.0-20241020004304-ec39f4a41287 // indirect + github.com/newacorn/cbrotli/go/cbrotli v0.0.0-20241020012012-8fb4aa8de81a // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/text v0.18.0 // indirect ) diff --git a/go.sum b/go.sum index 984a4973de..327f0b4e71 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,59 @@ -github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= -github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE= +github.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE= +github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/brotli/go/cbrotli v0.0.0-20240715182736-39bcecf4559f h1:gMt4P0lp6wvToXa3UD8JocJxpt0yyXdG8SLfLMxkpKM= github.com/google/brotli/go/cbrotli v0.0.0-20240715182736-39bcecf4559f/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= -github.com/gookit/goutil v0.6.16 h1:9fRMCF4X9abdRD5+2HhBS/GwafjBlTUBjRtA5dgkvuw= -github.com/gookit/goutil v0.6.16/go.mod h1:op2q8AoPDFSiY2+qkHxcBWQMYxOLQ1GbLXqe7vrwscI= +github.com/gookit/goutil v0.6.17 h1:SxmbDz2sn2V+O+xJjJhJT/sq1/kQh6rCJ7vLBiRPZjI= github.com/gookit/goutil v0.6.17/go.mod h1:rSw1LchE1I3TDWITZvefoAC9tS09SFu3lHXLCV7EaEY= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/newacorn/goutils v0.0.0-20241019173925-1c4a12c3439b h1:ADkm6B8+9M63SU+aYdFCmXMSfS8Eaaox/Ve2KdKzlqI= -github.com/newacorn/goutils v0.0.0-20241019173925-1c4a12c3439b/go.mod h1:NsSKXgKzrgEUa+t0dACbtVmLThFdAc9evTDjVMyilLw= -github.com/newacorn/goutils v0.0.0-20241019181402-f6ad1a3f638b h1:UnhOhzqoOx/LQtLL7kB2LbwXki05nezWbzW4/IYBdG8= -github.com/newacorn/goutils v0.0.0-20241019181402-f6ad1a3f638b/go.mod h1:NsSKXgKzrgEUa+t0dACbtVmLThFdAc9evTDjVMyilLw= -github.com/newacorn/simple-bytes-pool v0.0.0-20241019181444-92b43ac0f160 h1:kEqyT2t5o0G7n7VONiBterh1JJA6MGl1j97eOaDWXh8= -github.com/newacorn/simple-bytes-pool v0.0.0-20241019181444-92b43ac0f160/go.mod h1:4OrzMR8g8mqfdFC6YF4uQbyzcCUeNbPesOV5Xm4oClE= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/newacorn/brotli v0.0.0-20241020004304-ec39f4a41287 h1:RBVcYL27/O7ylBgSpucHbRw943cwcc4uGYbfoclASkM= +github.com/newacorn/brotli v0.0.0-20241020004304-ec39f4a41287/go.mod h1:/pzk9egPuUK+bgPWDjaofY1UPUmbNZnZSCxZOC1nf70= +github.com/newacorn/cbrotli/go/cbrotli v0.0.0-20241020012012-8fb4aa8de81a h1:aHOBJO8IpRxrKFuvkLvhL8J4KJazPpBFFNv/I2kwrgM= +github.com/newacorn/cbrotli/go/cbrotli v0.0.0-20241020012012-8fb4aa8de81a/go.mod h1:d24uOm/AOrVSxT6wVCHPnkdXFseNsVrChPJy7ns4/+M= +github.com/newacorn/compress v0.0.0-20241020002001-be411bf4ca21 h1:8XicvZROKa/PNx1w0VgkX6ou6xChrepVty8k7m3ijyM= +github.com/newacorn/compress v0.0.0-20241020002001-be411bf4ca21/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/newacorn/goutils v0.0.0-20241020012208-0c3368a3c285 h1:YPSIJXH6KJRKbPFpmVay6+IRBXMtA4hZvIGXaHYu4xc= +github.com/newacorn/goutils v0.0.0-20241020012208-0c3368a3c285/go.mod h1:qjtV7AwRt23XbTQ5yiyXoWmFwU67TUGLpMl6//knC6s= +github.com/newacorn/goutils v0.0.0-20241020013356-15e1e4834c16 h1:RDHDno4av2jsRnQN9+98OQvMaXojAB2hmIGzgJiP1xE= +github.com/newacorn/goutils v0.0.0-20241020013356-15e1e4834c16/go.mod h1:qjtV7AwRt23XbTQ5yiyXoWmFwU67TUGLpMl6//knC6s= +github.com/newacorn/simple-bytes-pool v0.0.0-20241019202108-1ca97a547e01 h1:6vk+EI/swL10uzvOd6d0L1f6N4Fl2diV/OfQ/9RKKSg= +github.com/newacorn/simple-bytes-pool v0.0.0-20241019202108-1ca97a547e01/go.mod h1:xFGWrrp5OYMtHB62gXV/ZI9C59pvJCSRJ3kMryw9+EY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= +github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/shirou/gopsutil/v4 v4.24.9 h1:KIV+/HaHD5ka5f570RZq+2SaeFsb/pq+fp2DGNWYoOI= +github.com/shirou/gopsutil/v4 v4.24.9/go.mod h1:3fkaHNeYsUFCGZ8+9vZVWtbyM1k2eRnlL+bWO8Bxa/Q= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= @@ -28,15 +62,22 @@ github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVS github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/header.go b/header.go index ac8eacbf97..f1a4164526 100644 --- a/header.go +++ b/header.go @@ -5,11 +5,11 @@ import ( "bytes" "errors" "fmt" + "github.com/newacorn/goutils/compress" "io" "sync" "sync/atomic" "time" - "utils/compress" ) const ( diff --git a/http.go b/http.go index bdad7e3766..d34a71cf2d 100644 --- a/http.go +++ b/http.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" pbufio "github.com/newacorn/goutils/bufio" + ucompress "github.com/newacorn/goutils/compress" pio "github.com/newacorn/goutils/io" pool "github.com/newacorn/simple-bytes-pool" "github.com/valyala/bytebufferpool" @@ -19,7 +20,6 @@ import ( "strings" "sync" "time" - ucompress "utils/compress" ) var ( diff --git a/server.go b/server.go index cdb9ebd78f..4069071895 100644 --- a/server.go +++ b/server.go @@ -6,7 +6,9 @@ import ( "crypto/tls" "errors" "fmt" + "github.com/newacorn/goutils" pbufio "github.com/newacorn/goutils/bufio" + "github.com/newacorn/goutils/compress" "github.com/puzpuzpuz/xsync/v3" "io" "log" @@ -20,8 +22,6 @@ import ( "sync/atomic" "syscall" "time" - "utils" - "utils/compress" ) var ErrCertAndKeyMustProvided = errors.New("cert and key must be both provided") @@ -3033,7 +3033,7 @@ func acquireByteReader(ctxP **RequestCtx) (r *bufio.Reader, err error) { tc, ok = c.(*net.TCPConn) } if ok { - n, err = utils.NoBlockingRead(tc, b[:]) + n, err = goutils.NoBlockingRead(tc, b[:]) if err != nil && err != syscall.EAGAIN { return } diff --git a/supplement.go b/supplement.go index dbbd555769..d577d26e27 100644 --- a/supplement.go +++ b/supplement.go @@ -1,9 +1,9 @@ package fasthttp import ( + "github.com/newacorn/goutils/compress" pio "github.com/newacorn/goutils/io" "io" - "utils/compress" ) // diff --git a/supplement_compress.go b/supplement_compress.go index f72bfceb94..156aaf81f7 100644 --- a/supplement_compress.go +++ b/supplement_compress.go @@ -6,8 +6,8 @@ import ( "fmt" pbufio "github.com/newacorn/goutils/bufio" pbytes "github.com/newacorn/goutils/bytes" + "github.com/newacorn/goutils/compress" "io" - "utils/compress" ) type WriterFlusherCloser interface { @@ -32,8 +32,7 @@ func (bw BufferedChunkedWriter) Flush() (err error) { return } -// const c = len(HeaderContentLength) -const k = HeaderContentLength + ": " +const contentLengthColonSpace = HeaderContentLength + ": " type ChunkedWriter struct { *bufio.Writer @@ -104,7 +103,7 @@ func (resp *Response) WriteCompress(w *bufio.Writer) (err error) { } // write content-length tmp := make([]byte, 32) - n1 := copy(tmp, k) + n1 := copy(tmp, contentLengthColonSpace) n2 := copy(tmp[n1:], AppendUintInto(tmp[n1:], buf.Len())) n3 := copy(tmp[n1+n2:], "\r\n\r\n") _, err = w.Write(tmp[:n1+n2+n3]) diff --git a/time_test.go b/time_test.go index 699c85b16f..c201b0afbb 100644 --- a/time_test.go +++ b/time_test.go @@ -1,10 +1,10 @@ package fasthttp import ( + "github.com/newacorn/goutils" "net" "testing" "time" - "utils" ) func TestAbsoluteToUnix(t *testing.T) { @@ -50,7 +50,7 @@ func TestStruct(t *testing.T) { //c1.Read() var p [1]byte if ok { - n, err := utils.NoBlockingRead(c1, p[:]) + n, err := goutils.NoBlockingRead(c1, p[:]) _ = n if err != nil { t.Log(err) diff --git a/tmp_test.go b/tmp_test.go index 334ae75e56..7e0628e378 100644 --- a/tmp_test.go +++ b/tmp_test.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "github.com/gookit/goutil/testutil/assert" + "github.com/newacorn/goutils/compress" "github.com/valyala/fasthttp" "golang.org/x/net/proxy" "log" @@ -13,7 +14,6 @@ import ( "sync/atomic" "testing" "time" - "utils/compress" ) type ProxyTCPDialer struct { diff --git a/uri.go b/uri.go index a8f4a484c6..91124164bf 100644 --- a/uri.go +++ b/uri.go @@ -4,11 +4,11 @@ import ( "bytes" "errors" "fmt" + "github.com/newacorn/goutils" "io" "path/filepath" "strconv" "sync" - "utils" ) // AcquireURI returns an empty URI instance from the pool. @@ -211,7 +211,7 @@ func (u *URI) Scheme() []byte { // If the result is enclosed in square brackets, as literal IPv6 addresses are, // the square brackets are removed from the result. func (u *URI) Hostname() string { - host, _ := utils.SplitHostAndPortStd(b2s(u.host)) + host, _ := goutils.SplitHostAndPortStd(b2s(u.host)) return host } @@ -219,7 +219,7 @@ func (u *URI) Hostname() string { // // If u.Host doesn't contain a valid numeric port, Port returns an empty string. func (u *URI) Port() string { - _, port := utils.SplitHostAndPortStd(b2s(u.host)) + _, port := goutils.SplitHostAndPortStd(b2s(u.host)) return port } diff --git a/zstd.go b/zstd.go index 867d7753ac..092928f21a 100644 --- a/zstd.go +++ b/zstd.go @@ -3,9 +3,9 @@ package fasthttp import ( "bytes" "fmt" + ucompress "github.com/newacorn/goutils/compress" "io" "sync" - ucompress "utils/compress" "github.com/klauspost/compress/zstd" "github.com/valyala/bytebufferpool"