slow.Reader{}

main
bel 2025-05-17 20:20:03 -06:00
parent d2f0466aae
commit 11b215d026
2 changed files with 59 additions and 0 deletions

39
src/slow/reader.go Normal file
View File

@ -0,0 +1,39 @@
package slow
import (
"context"
"io"
"golang.org/x/time/rate"
)
type Reader struct {
ctx context.Context
limiter *rate.Limiter
r io.Reader
}
var _ io.Reader = Reader{}
func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) Reader {
return Reader{
ctx: ctx,
limiter: rate.NewLimiter(bps, 8192),
r: r,
}
}
func (r Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
m := 0
burst := r.limiter.Burst()
for m < n {
if err := r.limiter.WaitN(r.ctx, burst); err != nil {
return n, err
}
m += burst
}
return n, err
}

20
src/slow/reader_test.go Normal file
View File

@ -0,0 +1,20 @@
package slow_test
import "show-rss/src/slow"
import "testing"
import "context"
import "bytes"
import "io"
func TestReader(t *testing.T) {
junk := bytes.NewReader(bytes.Repeat([]byte("1"), 256_000))
slowReader := slow.NewReader(context.Background(), 300_000, junk)
buff := bytes.NewBuffer(nil)
if n, err := io.Copy(buff, slowReader); err != nil {
t.Fatal(err)
} else if n != 256_000 {
t.Fatal(n)
}
}