jx/internal/transport/readerfrom.go

58 lines
1.0 KiB
Go
Raw Normal View History

// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package transport
import (
_ "errors"
_ "fmt"
_ "net/url"
_ "net/http"
_ "strings"
_ "path/filepath"
"io"
_ "os"
_ "context"
)
type ReadFilter func([]byte, int, error) (int, error)
var ReadBufferSize int = 32 * 1024
type readerFrom struct {
io.Writer
filter ReadFilter
}
func (w readerFrom) ReadFrom(r io.Reader) (n int64, err error) {
readBuffer := make([]byte, ReadBufferSize)
for {
var readBytes int
if readBytes, err = r.Read(readBuffer); readBytes > 0 {
if w.filter != nil {
readBytes, err = w.filter(readBuffer, readBytes, err)
}
writeBytes, writeErr := w.Write(readBuffer[0:readBytes])
if writeBytes > 0 {
n += int64(writeBytes)
}
if readBytes != writeBytes {
writeErr = io.ErrShortWrite
}
if writeErr != nil {
break
}
}
if err != nil {
if err == io.EOF {
err = nil
}
break
}
}
return
}
func NewReaderFrom(w io.Writer, filter ReadFilter) io.ReaderFrom {
return readerFrom{ Writer: w, filter: filter}
}