code: func NewReader(ctx context.Context, r io.Reader) *ctxReader {
  	return &ctxReader{ctx: ctx, r: r}
  }
docs: // NewReader wraps a reader to make it respect given Context.
  // If there is a blocking read, the returned Reader will return
  // whenever the context is cancelled (the return values are n=0
  // and err=ctx.Err().)
  //
  // Note well: this wrapper DOES NOT ACTUALLY cancel the underlying
  // write-- there is no way to do that with the standard go io
  // interface. So the read and write _will_ happen or hang. So, use
  // this sparingly, make sure to cancel the read or write as necesary
  // (e.g. closing a connection whose context is up, etc.)
  //
  // Furthermore, in order to protect your memory from being read
  // _before_ you've cancelled the context, this io.Reader will
  // allocate a buffer of the same size, and **copy** into the client's
  // if the read succeeds in time.