|
|
@@ -19,16 +19,26 @@ var (
|
|
|
)
|
|
|
|
|
|
func fetchInput(ctx context.Context, input io.Reader, reader PacketReader, conn *Connection) {
|
|
|
- payload := buf.New()
|
|
|
- defer payload.Release()
|
|
|
-
|
|
|
- for {
|
|
|
- err := payload.Reset(buf.ReadFrom(input))
|
|
|
- if err != nil {
|
|
|
- payload.Release()
|
|
|
- return
|
|
|
+ cache := make(chan *buf.Buffer, 1024)
|
|
|
+ go func() {
|
|
|
+ for {
|
|
|
+ payload := buf.New()
|
|
|
+ if err := payload.Reset(buf.ReadFrom(input)); err != nil {
|
|
|
+ payload.Release()
|
|
|
+ close(cache)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ select {
|
|
|
+ case cache <- payload:
|
|
|
+ default:
|
|
|
+ payload.Release()
|
|
|
+ }
|
|
|
}
|
|
|
+ }()
|
|
|
+
|
|
|
+ for payload := range cache {
|
|
|
segments := reader.Read(payload.Bytes())
|
|
|
+ payload.Release()
|
|
|
if len(segments) > 0 {
|
|
|
conn.Input(segments)
|
|
|
}
|