|
@@ -9,34 +9,11 @@ import (
|
|
|
"v2ray.com/core/common/signal"
|
|
"v2ray.com/core/common/signal"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-type errorHandler func(error) error
|
|
|
|
|
type dataHandler func(MultiBuffer)
|
|
type dataHandler func(MultiBuffer)
|
|
|
|
|
|
|
|
//go:notinheap
|
|
//go:notinheap
|
|
|
type copyHandler struct {
|
|
type copyHandler struct {
|
|
|
- onReadError []errorHandler
|
|
|
|
|
- onData []dataHandler
|
|
|
|
|
- onWriteError []errorHandler
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (h *copyHandler) readFrom(reader Reader) (MultiBuffer, error) {
|
|
|
|
|
- mb, err := reader.ReadMultiBuffer()
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- for _, handler := range h.onReadError {
|
|
|
|
|
- err = handler(err)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return mb, err
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (h *copyHandler) writeTo(writer Writer, mb MultiBuffer) error {
|
|
|
|
|
- err := writer.WriteMultiBuffer(mb)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- for _, handler := range h.onWriteError {
|
|
|
|
|
- err = handler(err)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return err
|
|
|
|
|
|
|
+ onData []dataHandler
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// SizeCounter is for counting bytes copied by Copy().
|
|
// SizeCounter is for counting bytes copied by Copy().
|
|
@@ -101,13 +78,13 @@ func IsWriteError(err error) bool {
|
|
|
|
|
|
|
|
func copyInternal(reader Reader, writer Writer, handler *copyHandler) error {
|
|
func copyInternal(reader Reader, writer Writer, handler *copyHandler) error {
|
|
|
for {
|
|
for {
|
|
|
- buffer, err := handler.readFrom(reader)
|
|
|
|
|
|
|
+ buffer, err := reader.ReadMultiBuffer()
|
|
|
if !buffer.IsEmpty() {
|
|
if !buffer.IsEmpty() {
|
|
|
for _, handler := range handler.onData {
|
|
for _, handler := range handler.onData {
|
|
|
handler(buffer)
|
|
handler(buffer)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if werr := handler.writeTo(writer, buffer); werr != nil {
|
|
|
|
|
|
|
+ if werr := writer.WriteMultiBuffer(buffer); werr != nil {
|
|
|
return writeError{werr}
|
|
return writeError{werr}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|