package ratelimit

import "io"

type reader struct {
    r      io.Reader
    bucket *Bucket
}

// Reader returns a reader that is rate limited by
// the given token bucket. Each token in the bucket
// represents one byte.
func Reader(r io.Reader, bucket *Bucket) io.Reader {
    return &reader{
        r:      r,
        bucket: bucket,
    }
}

func (r *reader) Read(buf []byte) (int, error) {
    n, err := r.r.Read(buf)
    if n <= 0 {
        return n, err
    }
    r.bucket.Wait(int64(n))
    return n, err
}

type writer struct {
    w      io.Writer
    bucket *Bucket
}

// Writer returns a reader that is rate limited by
// the given token bucket. Each token in the bucket
// represents one byte.
func Writer(w io.Writer, bucket *Bucket) io.Writer {
    return &writer{
        w:      w,
        bucket: bucket,
    }
}

func (w *writer) Write(buf []byte) (int, error) {
    w.bucket.Wait(int64(len(buf)))
    return w.w.Write(buf)
}

最新文章

  1. Android Studio开发RecyclerView遇到的各种问题以及解决(二)
  2. es5 and es6
  3. C语言写的流氓关机程序及破解
  4. python基础——使用@property
  5. CODESOFT中的圆角矩形的弧度该怎样设置?
  6. GitHub指南
  7. css,html命名规则
  8. ECSHOP文件目录详解
  9. node.js&amp;mongodb&amp;express 搭建个人博客系统
  10. Jenkins的plugin开发
  11. error2
  12. DAY:3 列表
  13. cent os安装filebeat
  14. Java 集合并交补
  15. linQ to sql 查询生成的sql语句
  16. 31、Flask实战第31天:cms后台修改密码
  17. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
  18. 分布式_事务_01_2PC框架raincat快速体验1
  19. DAY16-Django之MTV
  20. 【Linux】tcp缓冲区大小的默认值、最大值

热门文章

  1. ASP.NET Core 2.0 使用NLog实现日志记录
  2. Spring消息之WebSocket
  3. python结巴(jieba)分词
  4. 2017 Gartner数据科学魔力象限出炉,16位上榜公司花落谁家?
  5. JS跨域:2.解决方案之-设置回调参数
  6. FastDfs上传图片
  7. 基于.net的爬虫应用-DotnetSpider
  8. 团队项目第二阶段个人进展——Day9
  9. Nordic nRF51/nRF52开发环境搭建
  10. QT中的相对位置,绝对位置之间的转换(maptoglobal,mapfromglobal)