diff --git a/app/proxyman/mux/reader.go b/app/proxyman/mux/reader.go index ad18c3f04..bc1c5d860 100644 --- a/app/proxyman/mux/reader.go +++ b/app/proxyman/mux/reader.go @@ -28,7 +28,7 @@ func (r *Reader) ReadMetadata() (*FrameMetadata, error) { } metaLen := serial.BytesToUint16(b.Bytes()) if metaLen > 512 { - return nil, newError("invalid metalen ", metaLen) + return nil, newError("invalid metalen ", metaLen).AtWarning() } b.Clear() if err := b.AppendSupplier(buf.ReadFullFrom(r.reader, int(metaLen))); err != nil { diff --git a/app/proxyman/mux/writer.go b/app/proxyman/mux/writer.go index a2f802628..c4541735e 100644 --- a/app/proxyman/mux/writer.go +++ b/app/proxyman/mux/writer.go @@ -15,9 +15,10 @@ type Writer struct { func NewWriter(id uint16, dest net.Destination, writer buf.Writer) *Writer { return &Writer{ - id: id, - dest: dest, - writer: writer, + id: id, + dest: dest, + writer: writer, + followup: false, } } @@ -29,7 +30,7 @@ func NewResponseWriter(id uint16, writer buf.Writer) *Writer { } } -func (w *Writer) Write(mb buf.MultiBuffer) error { +func (w *Writer) writeInternal(mb buf.MultiBuffer) error { meta := FrameMetadata{ SessionID: w.id, Target: w.dest, @@ -58,6 +59,17 @@ func (w *Writer) Write(mb buf.MultiBuffer) error { return w.writer.Write(mb2) } +func (w *Writer) Write(mb buf.MultiBuffer) error { + const chunkSize = 8 * 1024 + for !mb.IsEmpty() { + slice := mb.SliceBySize(chunkSize) + if err := w.writeInternal(slice); err != nil { + return err + } + } + return nil +} + func (w *Writer) Close() { meta := FrameMetadata{ SessionID: w.id, diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index 2dbb65fe4..ffb3b9a9d 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -86,3 +86,18 @@ func (mb MultiBuffer) ToNetBuffers() net.Buffers { } return bs } + +func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { + slice := NewMultiBuffer() + sliceSize := 0 + endIndex := len(*mb) + for i, b := range *mb { + if b.Len()+sliceSize > size { + endIndex = i + break + } + slice.Append(b) + } + *mb = (*mb)[endIndex:] + return slice +}