| 
					
				 | 
			
			
				@@ -53,6 +53,22 @@ type copyHandler struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	onWriteError func(error) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (h *copyHandler) readFrom(reader Reader) (MultiBuffer, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	mb, err := reader.Read() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil && h.onReadError != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = h.onReadError(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return mb, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (h *copyHandler) writeTo(writer Writer, mb MultiBuffer) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err := writer.Write(mb) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil && h.onWriteError != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = h.onWriteError(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type CopyOption func(*copyHandler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func IgnoreReaderError() CopyOption { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -79,27 +95,25 @@ func UpdateActivity(timer signal.ActivityTimer) CopyOption { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func copyInternal(reader Reader, writer Writer, handler copyHandler) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		buffer, err := reader.Read() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		buffer, err := handler.readFrom(reader) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err = handler.onReadError(err); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		handler.onData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if buffer.IsEmpty() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			buffer.Release() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err := writer.Write(buffer); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if err = handler.onWriteError(err); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				buffer.Release() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if handler.onData != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			handler.onData() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err := handler.writeTo(writer, buffer); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			buffer.Release() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -107,9 +121,9 @@ func copyInternal(reader Reader, writer Writer, handler copyHandler) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Copy dumps all payload from reader to writer or stops when an error occurs. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // ActivityTimer gets updated as soon as there is a payload. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func Copy(reader Reader, writer Writer, options ...CopyOption) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	handler := copyHandler{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	handler := new(copyHandler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, option := range options { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		option(&handler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		option(handler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	err := copyInternal(reader, writer, handler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil && errors.Cause(err) != io.EOF { 
			 |