@@ -138,7 +138,7 @@ func (b *BaseHeader) ReadHead(buffer []byte) (length uint32) {
138138 case 1 :
139139 length = uint32 (buffer [uint32 (b .LengthFieldOffset )]) - uint32 (b .LengthAdjustment )
140140 case 2 :
141- length = uint32 (b .ByteOrder .Uint16 (buffer [+ uint32 (b .LengthFieldOffset ):])) - uint32 (b .LengthAdjustment )
141+ length = uint32 (b .ByteOrder .Uint16 (buffer [uint32 (b .LengthFieldOffset ):])) - uint32 (b .LengthAdjustment )
142142 case 4 :
143143 length = uint32 (b .ByteOrder .Uint32 (buffer [uint32 (b .LengthFieldOffset ):])) - uint32 (b .LengthAdjustment )
144144 default :
@@ -749,6 +749,34 @@ func NewPassReadWriteCloser(header Header, raw io.ReadWriteCloser, bufferSize in
749749 return
750750}
751751
752+ func NewPassReadWriter (header Header , raw io.ReadWriter , bufferSize int ) (pass * PassReadWriteCloser ) {
753+ if bufferSize < 1 {
754+ panic ("buffer size is < 1" )
755+ }
756+ if header == nil {
757+ header = NewDefaultHeader ()
758+ } else {
759+ header = CloneHeader (header )
760+ }
761+ closer , _ := raw .(io.Closer )
762+ pass = & PassReadWriteCloser {
763+ Closer : closer ,
764+ PassReadCloser : NewPassReader (raw ),
765+ PassWriteCloser : NewPassWriter (raw , bufferSize ),
766+ }
767+ pass .Header = header
768+ pass .PassReadCloser .Header = header
769+ pass .PassWriteCloser .Header = header
770+ return
771+ }
772+
773+ func (r * PassReadWriteCloser ) Close () (err error ) {
774+ if r .Closer != nil {
775+ err = r .Closer .Close ()
776+ }
777+ return
778+ }
779+
752780type PassWriteCloser struct {
753781 Header
754782 io.Writer
@@ -785,6 +813,10 @@ func (w *PassWriteCloser) readFrame(header uint32, buffer []byte) (size uint32,
785813 return
786814 }
787815 frameLength := w .ReadHead (buffer )
816+ if frameLength < 1 {
817+ err = fmt .Errorf ("head is zero" )
818+ return
819+ }
788820 if frameLength > uint32 (len (w .buffer )) {
789821 err = ErrFrameTooLarge
790822 return
@@ -873,7 +905,7 @@ func NewPassReadCloser(from io.ReadCloser) (reader *PassReadCloser) {
873905 return
874906}
875907
876- func NewWrapReader (from io.Reader ) (reader * PassReadCloser ) {
908+ func NewPassReader (from io.Reader ) (reader * PassReadCloser ) {
877909 reader = & PassReadCloser {
878910 Header : NewDefaultHeader (),
879911 Reader : from ,
0 commit comments