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

Function parseIndexSection

go/bundle/decoder.go:145–203  ·  view source on GitHub ↗

https://wpack-wg.github.io/bundled-responses/draft-ietf-wpack-bundled-responses.html#name-the-index-section

(sectionContents []byte, sectionsStart uint64, sos []sectionOffset)

Source from the content-addressed store, hash-verified

143
144// https://wpack-wg.github.io/bundled-responses/draft-ietf-wpack-bundled-responses.html#name-the-index-section
145func parseIndexSection(sectionContents []byte, sectionsStart uint64, sos []sectionOffset) ([]requestEntryWithOffset, error) {
146 dec := cbor.NewDecoder(bytes.NewBuffer(sectionContents))
147 numUrls, err := dec.DecodeMapHeader()
148 if err != nil {
149 return nil, fmt.Errorf("bundle.index: failed to decode index section map header: %v", err)
150 }
151 requests := []requestEntryWithOffset{}
152
153 respso, respSectionRelOffset, found := FindSection(sos, "responses")
154 if !found {
155 return nil, fmt.Errorf("bundle.index: \"responses\" section not found")
156 }
157 respSectionOffset := sectionsStart + respSectionRelOffset
158 makeRelativeToStream := func(offset, length uint64) (uint64, uint64, error) {
159 if offset+length > respso.Length {
160 return 0, 0, errors.New("bundle.index: response length out-of-range")
161 }
162 return respSectionOffset + offset, length, nil
163 }
164
165 for i := uint64(0); i < numUrls; i++ {
166 rawUrl, err := dec.DecodeTextString()
167 if err != nil {
168 return nil, fmt.Errorf("bundle.index[%d]: Failed to decode map key: %v", i, err)
169 }
170 parsedUrl, err := url.Parse(rawUrl)
171 if err != nil {
172 return nil, fmt.Errorf("bundle.index[%d]: Failed to parse URL: %v", i, err)
173 }
174 if parsedUrl.Fragment != "" {
175 return nil, fmt.Errorf("bundle.index[%d]: URL contains fragment: %q", i, rawUrl)
176 }
177 if parsedUrl.User != nil {
178 return nil, fmt.Errorf("bundle.index[%d]: URL contains credentials: %q", i, rawUrl)
179 }
180
181 numItems, err := dec.DecodeArrayHeader()
182 if err != nil {
183 return nil, fmt.Errorf("bundle.index[%d]: Failed to decode value array header: %v", i, err)
184 }
185 if numItems != 2 {
186 return nil, fmt.Errorf("bundle.index[%d]: value array must be exactly 2 elements: offset and length.", i)
187 }
188 offset, err := dec.DecodeUint()
189 if err != nil {
190 return nil, fmt.Errorf("bundle.index[%d]: Failed to decode offset: %v", i, err)
191 }
192 length, err := dec.DecodeUint()
193 if err != nil {
194 return nil, fmt.Errorf("bundle.index[%d]: Failed to decode length: %v", i, err)
195 }
196 offset, length, err = makeRelativeToStream(offset, length)
197 if err != nil {
198 return nil, fmt.Errorf("bundle.index[%d]: %v", i, err)
199 }
200 requests = append(requests, requestEntryWithOffset{Request: Request{URL: parsedUrl}, Offset: offset, Length: length})
201 }
202 return requests, nil

Callers 1

loadMetadataFunction · 0.85

Calls 6

DecodeMapHeaderMethod · 0.95
DecodeTextStringMethod · 0.95
DecodeArrayHeaderMethod · 0.95
DecodeUintMethod · 0.95
NewDecoderFunction · 0.92
FindSectionFunction · 0.85

Tested by

no test coverage detected