// Recv implements the `Recv` func in the Reader interface. func (r *DefaultReader) Recv() { for { select { case <-r.closer: return default: header := new(Header) if err := header.Read(r.src); err != nil { r.errs <- err continue } header = r.normalizer.Normalize(header) builder := r.builder(header) n := spec.Min(builder.BytesLeft(), r.ReadSize()) if _, err := builder.Read(r.src, n); err != nil { r.errs <- err continue } if builder.BytesLeft() == 0 { chunk := builder.Build() if !r.updateChunkSize(chunk) { r.chunks <- chunk } r.removeBuilder(header.BasicHeader.StreamId) } } } }
// Write implements the Write function defined in the Writer interface. func (w *DefaultWriter) Write(c *Chunk) error { payload := bytes.NewBuffer(c.Data) out := new(bytes.Buffer) c.Header.Write(out) for payload.Len() > 0 { io.CopyN(out, payload, int64(spec.Min(payload.Len(), w.WriteSize()))) if payload.Len() > 0 { out.Write([]byte{byte( (3 << 6) | (c.Header.BasicHeader.StreamId & 63)), }) } } if _, err := io.Copy(w.dest, out); err != nil { return err } return nil }