reader.go 999 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // Copyright 2014 Canonical Ltd.
  2. // Licensed under the LGPLv3 with static-linking exception.
  3. // See LICENCE file for details.
  4. package ratelimit
  5. import "io"
  6. type reader struct {
  7. r io.Reader
  8. bucket *Bucket
  9. }
  10. // Reader returns a reader that is rate limited by
  11. // the given token bucket. Each token in the bucket
  12. // represents one byte.
  13. func Reader(r io.Reader, bucket *Bucket) io.Reader {
  14. return &reader{
  15. r: r,
  16. bucket: bucket,
  17. }
  18. }
  19. func (r *reader) Read(buf []byte) (int, error) {
  20. n, err := r.r.Read(buf)
  21. if n <= 0 {
  22. return n, err
  23. }
  24. r.bucket.Wait(int64(n))
  25. return n, err
  26. }
  27. type writer struct {
  28. w io.Writer
  29. bucket *Bucket
  30. }
  31. // Writer returns a reader that is rate limited by
  32. // the given token bucket. Each token in the bucket
  33. // represents one byte.
  34. func Writer(w io.Writer, bucket *Bucket) io.Writer {
  35. return &writer{
  36. w: w,
  37. bucket: bucket,
  38. }
  39. }
  40. func (w *writer) Write(buf []byte) (int, error) {
  41. w.bucket.Wait(int64(len(buf)))
  42. return w.w.Write(buf)
  43. }