79664237

Date: 2025-06-13 00:36:33
Score: 0.5
Natty:
Report link

Here's how to define an io.Reader wrapper with the desired behavior:

// NewSleepyReader returns a reader that sleeps for duration
// after reading each block of num bytes from an underlying reader.
func NewSleepyReader(underlying io.Reader, num int, duration time.Duration) io.Reader {
    return &sleepyReader{r: underlying, num: num, duration: duration}
}

type sleepyReader struct {
    r        io.Reader
    duration time.Duration
    num      int
    i        int
}

func (sr *sleepyReader) Read(p []byte) (int, error) {
    n, err := sr.r.Read(p[:min(len(p), sr.num-sr.i)])
    sr.i += n
    if sr.i >= sr.num {
        time.Sleep(sr.duration)
        sr.i = 0
    }
    return n, err
}

Use it like this in your application:

_, err := io.Copy(io.Discard, NewSleepyReader(r.Body, 10, time.Second))
if err != nil {
    w.WriteHeader(http.StatusInternalServerError)
    return
}
Reasons:
  • Long answer (-0.5):
  • Has code block (-0.5):
  • Unregistered user (0.5):
  • Low reputation (1):
Posted by: Malex Padilla