Open
Description
There is an undocumented buffer limit of 4kb for each link in a transform.Chain
What did you do?
Implemented a transform.Transformer
which expects transform.Chain
to buffer all src
until EOF.
package main
import "golang.org/x/text/transform"
type Transformer struct {
transform.NopResetter
}
func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
if !atEOF {
err = transform.ErrShortSrc
} else {
n := copy(dst, src)
nDst = n
nSrc = n
if n < len(src) {
err = transform.ErrShortDst
}
}
return
}
func main() {
data := make([]byte, 4096+1)
tr := transform.Chain(
transform.Nop,
&Transformer{},
)
_, _, err := transform.Bytes(tr, data)
if err != nil {
panic(err)
}
}
https://play.golang.org/p/kFLxWtfNwnF
What did you expect to see?
Since the transform.Transformer
implementation follows all the rules laid out by the docs, I expected it to work.
What did you see instead?
The chain returns a "transform: short internal buffer" error if it's asked to buffer more than 4kb (while nothing is consumed).