}
defer to.l.Unlock()
- return transferIO(t.read(), to.write(), byteInSec)
+ return transferIO(t.read(), to.write(), byteInSec, -1)
}
func (t *File) CopyToIoWriter(to io.Writer, byteInSec int64, tryLock bool) error {
}
defer t.l.RUnlock()
- return transferIO(t.read(), to, byteInSec)
+ return transferIO(t.read(), to, byteInSec, -1)
+}
+
+func (t *File) CopyToIoWriterUntil(to io.Writer, byteInSec, totalSec int64, tryLock bool) error {
+ t.getRWCloser()
+ if t.Config.AutoClose {
+ defer t.Close()
+ }
+
+ if !t.l.TryRLock() {
+ return ErrFailToLock
+ }
+ defer t.l.RUnlock()
+
+ return transferIO(t.read(), to, byteInSec, totalSec)
}
func (t *File) Write(data []byte, tryLock bool) (int, error) {
}
}
-func transferIO(r io.Reader, w io.Writer, byteInSec int64) (e error) {
+func transferIO(r io.Reader, w io.Writer, byteInSec, totalSec int64) (e error) {
if byteInSec > 0 {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
- for buf := make([]byte, byteInSec); true; {
+ for buf := make([]byte, byteInSec); totalSec < 0 || totalSec > 0; totalSec -= 1 {
if n, err := r.Read(buf); n != 0 {
if _, werr := w.Write(buf[:n]); werr != nil {
return err
return res
}
+type withflush struct {
+ f func()
+ h func() http.Header
+ w func([]byte) (int, error)
+ wh func(int)
+}
+
+func (t withflush) Header() http.Header {
+ return t.h()
+}
+func (t withflush) Write(b []byte) (i int, e error) {
+ i, e = t.w(b)
+ if t.f != nil {
+ t.f()
+ }
+ return
+}
+func (t withflush) WriteHeader(i int) {
+ t.wh(i)
+}
+
+func WithFlush(w http.ResponseWriter) http.ResponseWriter {
+ if Flusher, ok := w.(http.Flusher); ok {
+ return withflush{
+ f: Flusher.Flush,
+ h: w.Header,
+ w: w.Write,
+ wh: w.WriteHeader,
+ }
+ }
+ return w
+}
+
func WithStatusCode(w http.ResponseWriter, code int) {
w.WriteHeader(code)
_, _ = w.Write([]byte(http.StatusText(code)))