https://wpack-wg.github.io/bundled-responses/draft-ietf-wpack-bundled-responses.html#name-the-index-section
(sectionContents []byte, sectionsStart uint64, sos []sectionOffset)
| 143 | |
| 144 | // https://wpack-wg.github.io/bundled-responses/draft-ietf-wpack-bundled-responses.html#name-the-index-section |
| 145 | func 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 |
no test coverage detected