package http3
import (
"io"
"github.com/quic-go/quic-go/quicvarint"
)
type CapsuleType uint64
const CapsuleProtocolHeader = "Capsule-Protocol"
type exactReader struct {
R io .LimitedReader
}
func (r *exactReader ) Read (b []byte ) (int , error ) {
n , err := r .R .Read (b )
if err == io .EOF && r .R .N > 0 {
return n , io .ErrUnexpectedEOF
}
return n , err
}
type countingByteReader struct {
io .ByteReader
Read int
}
func (r *countingByteReader ) ReadByte () (byte , error ) {
b , err := r .ByteReader .ReadByte ()
if err == nil {
r .Read ++
}
return b , err
}
func ParseCapsule (r quicvarint .Reader ) (CapsuleType , io .Reader , error ) {
cbr := countingByteReader {ByteReader : r }
ct , err := quicvarint .Read (&cbr )
if err != nil {
if err == io .EOF && cbr .Read > 0 {
return 0 , nil , io .ErrUnexpectedEOF
}
return 0 , nil , err
}
l , err := quicvarint .Read (r )
if err != nil {
if err == io .EOF {
return 0 , nil , io .ErrUnexpectedEOF
}
return 0 , nil , err
}
return CapsuleType (ct ), &exactReader {R : io .LimitedReader {R : r , N : int64 (l )}}, nil
}
func WriteCapsule (w quicvarint .Writer , ct CapsuleType , value []byte ) error {
b := make ([]byte , 0 , 16 )
b = quicvarint .Append (b , uint64 (ct ))
b = quicvarint .Append (b , uint64 (len (value )))
if _ , err := w .Write (b ); err != nil {
return err
}
_ , err := w .Write (value )
return err
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .