// Copyright 2024 Matthew Rich . 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} }