Example #1
0
// 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)
			}
		}
	}
}
Example #2
0
// 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
}