MCPcopy Create free account
hub / github.com/WICG/webpackage / NewDecoder

Method NewDecoder

go/signedexchange/mice/mice.go:167–198  ·  view source on GitHub ↗

NewDecoder creates a new http-mice stream decoder. It reads first few bytes from r to determine the record size, and fails if the record size exceeds maxRecordSize.

(r io.Reader, digestHeaderValue string, maxRecordSize uint64)

Source from the content-addressed store, hash-verified

165// from r to determine the record size, and fails if the record size exceeds
166// maxRecordSize.
167func (enc Encoding) NewDecoder(r io.Reader, digestHeaderValue string, maxRecordSize uint64) (io.Reader, error) {
168 toplevelProof, err := enc.parseDigestHeader(digestHeaderValue)
169 if err != nil {
170 return nil, err
171 }
172
173 var recordSize uint64
174 err = binary.Read(r, binary.BigEndian, &recordSize)
175 if err == io.EOF && enc != Draft02Encoding {
176 // As a special case, the encoding of an empty payload is itself an
177 // empty message (i.e. it omits the initial record size), and its
178 // integrity proof is SHA-256("\0"). [spec text]
179 if !validateRecord(nil, toplevelProof, true) {
180 return nil, ErrValidationFailure
181 }
182 // Return an empty reader.
183 return &decoder{encoding: enc}, nil
184 }
185 if err != nil {
186 return nil, fmt.Errorf("mice: cannot read record size: %v", err)
187 }
188 if recordSize == 0 || recordSize > maxRecordSize {
189 return nil, fmt.Errorf("mice: invalid record size %v", recordSize)
190 }
191 return &decoder{
192 encoding: enc,
193 recordSize: recordSize,
194 r: r,
195 nextProof: toplevelProof,
196 recordBuf: make([]byte, recordSize+sha256.Size),
197 }, nil
198}
199
200func (d *decoder) Read(dst []byte) (int, error) {
201 if len(d.out) == 0 {

Callers 6

ReadHarFunction · 0.80
VerifyExchangeMethod · 0.80
verifyPayloadFunction · 0.80
createDecoderFunction · 0.80

Calls 3

parseDigestHeaderMethod · 0.95
validateRecordFunction · 0.85
ReadMethod · 0.80

Tested by 2

createDecoderFunction · 0.64