// supports the ReadFrom method, and b has no buffered data yet,
// this calls the underlying ReadFrom without buffering.
func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
+ if b.err != nil {
+ return 0, b.err
+ }
if b.Buffered() == 0 {
if w, ok := b.wr.(io.ReaderFrom); ok {
n, err = w.ReadFrom(r)
}
}
+type writeErrorOnlyWriter struct{}
+
+func (w writeErrorOnlyWriter) Write(p []byte) (n int, err error) {
+ return 0, errors.New("writeErrorOnlyWriter error")
+}
+
+// Ensure that previous Write errors are immediately returned
+// on any ReadFrom. See golang.org/issue/35194.
+func TestWriterReadFromMustReturnUnderlyingError(t *testing.T) {
+ var wr = NewWriter(writeErrorOnlyWriter{})
+ s := "test1"
+ wantBuffered := len(s)
+ if _, err := wr.WriteString(s); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if err := wr.Flush(); err == nil {
+ t.Error("expected flush error, got nil")
+ }
+ if _, err := wr.ReadFrom(strings.NewReader("test2")); err == nil {
+ t.Fatal("expected error, got nil")
+ }
+ if buffered := wr.Buffered(); buffered != wantBuffered {
+ t.Fatalf("Buffered = %v; want %v", buffered, wantBuffered)
+ }
+}
+
func BenchmarkReaderCopyOptimal(b *testing.B) {
// Optimal case is where the underlying reader implements io.WriterTo
srcBuf := bytes.NewBuffer(make([]byte, 8192))