(bucketName, listParams, list)
| 175 | } |
| 176 | |
| 177 | function processMasterVersions(bucketName, listParams, list) { |
| 178 | const xml = []; |
| 179 | xml.push( |
| 180 | '<?xml version="1.0" encoding="UTF-8"?>', |
| 181 | '<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">', |
| 182 | '<Name>', bucketName, '</Name>' |
| 183 | ); |
| 184 | const isTruncated = list.IsTruncated ? 'true' : 'false'; |
| 185 | const xmlParams = [ |
| 186 | { tag: 'Prefix', value: listParams.prefix || '' }, |
| 187 | { tag: 'MaxKeys', value: listParams.maxKeys }, |
| 188 | { tag: 'Delimiter', value: listParams.delimiter }, |
| 189 | { tag: 'EncodingType', value: listParams.encoding }, |
| 190 | { tag: 'IsTruncated', value: isTruncated }, |
| 191 | ]; |
| 192 | |
| 193 | if (listParams.v2) { |
| 194 | xmlParams.push({ tag: 'StartAfter', value: listParams.startAfter || '' }); |
| 195 | xmlParams.push({ tag: 'FetchOwner', value: `${listParams.fetchOwner}` }); |
| 196 | xmlParams.push({ tag: 'ContinuationToken', value: generateToken(listParams.continuationToken) || '' }); |
| 197 | xmlParams.push({ tag: 'NextContinuationToken', value: generateToken(list.NextContinuationToken) }); |
| 198 | xmlParams.push({ tag: 'KeyCount', value: list.Contents ? list.Contents.length : 0 }); |
| 199 | } else { |
| 200 | xmlParams.push({ tag: 'Marker', value: listParams.marker || '' }); |
| 201 | xmlParams.push({ tag: 'NextMarker', value: list.NextMarker }); |
| 202 | } |
| 203 | |
| 204 | const escapeXmlFn = listParams.encoding === 'url' ? querystring.escape : escapeForXml; |
| 205 | xmlParams.forEach(p => { |
| 206 | if (p.value && xmlParamsToSkipUrlEncoding.has(p.tag)) { |
| 207 | xml.push(`<${p.tag}>${p.value}</${p.tag}>`); |
| 208 | } else if (p.value || p.tag === 'KeyCount' || p.tag === 'MaxKeys') { |
| 209 | xml.push(`<${p.tag}>${escapeXmlFn(p.value)}</${p.tag}>`); |
| 210 | } else if (p.tag !== 'NextMarker' && |
| 211 | p.tag !== 'EncodingType' && |
| 212 | p.tag !== 'Delimiter' && |
| 213 | p.tag !== 'StartAfter' && |
| 214 | p.tag !== 'NextContinuationToken') { |
| 215 | xml.push(`<${p.tag}/>`); |
| 216 | } |
| 217 | }); |
| 218 | |
| 219 | list.Contents.forEach(item => { |
| 220 | const v = item.value; |
| 221 | if (v.isDeleteMarker) { |
| 222 | return null; |
| 223 | } |
| 224 | |
| 225 | const objectKey = escapeXmlFn(item.key); |
| 226 | xml.push( |
| 227 | '<Contents>', |
| 228 | `<Key>${objectKey}</Key>`, |
| 229 | `<LastModified>${v.LastModified}</LastModified>`, |
| 230 | `<ETag>"${v.ETag}"</ETag>`, |
| 231 | `<Size>${v.Size}</Size>` |
| 232 | ); |
| 233 | |
| 234 | if (!listParams.v2 || listParams.fetchOwner) { |
no test coverage detected