@@ -115,12 +115,7 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
115115 for _ , option := range options {
116116 option (& handler )
117117 }
118- var err error
119- if sReader , ok := reader .(* SingleReader ); ok && false {
120- err = copyV (sReader , writer , & handler )
121- } else {
122- err = copyInternal (reader , writer , & handler )
123- }
118+ err := copyInternal (reader , writer , & handler )
124119 if err != nil && errors .Cause (err ) != io .EOF {
125120 return err
126121 }
@@ -141,7 +136,31 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
141136 return writer .WriteMultiBuffer (mb )
142137}
143138
144- func copyV (r * SingleReader , w Writer , handler * copyHandler ) error {
139+ func TryCopyV (reader Reader , writer Writer , options ... CopyOption ) error {
140+ var doCopyV bool
141+ if tr , ok := reader .(* TimeoutWrapperReader ); ok {
142+ if _ , ok := tr .Reader .(* SingleReader ); ok {
143+ doCopyV = true
144+ }
145+ }
146+ if _ , ok := reader .(* SingleReader ); ok {
147+ doCopyV = true
148+ }
149+ if doCopyV {
150+ return Copy (reader , writer , options ... )
151+ }
152+ var handler copyHandler
153+ for _ , option := range options {
154+ option (& handler )
155+ }
156+ err := copyVInternal (reader , writer , & handler )
157+ if err != nil && errors .Cause (err ) != io .EOF {
158+ return err
159+ }
160+ return nil
161+ }
162+
163+ func copyVInternal (r Reader , w Writer , handler * copyHandler ) error {
145164 // channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
146165 // default buffer size:
147166 // 0 in ARM MIPS MIPSLE
@@ -162,23 +181,25 @@ func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
162181 defer wg .Done ()
163182 defer close (cache )
164183 for {
165- b , err := r .readBuffer ()
166- if err == nil {
167- select {
168- case cache <- b :
169- // must be write error
170- case <- stopRead :
171- b .Release ()
184+ mb , err := r .ReadMultiBuffer ()
185+ for _ , b := range mb {
186+ if err == nil {
187+ select {
188+ case cache <- b :
189+ // must be write error
190+ case <- stopRead :
191+ b .Release ()
192+ return
193+ }
194+ } else {
195+ rErr = err
196+ select {
197+ case cache <- b :
198+ case <- stopRead :
199+ b .Release ()
200+ }
172201 return
173202 }
174- } else {
175- rErr = err
176- select {
177- case cache <- b :
178- case <- stopRead :
179- b .Release ()
180- }
181- return
182203 }
183204 }
184205 }()
0 commit comments