Skip to content

Commit fbcfe63

Browse files
authored
fix listing bug in v1 and add missing v1 version listing (#1405)
1 parent 6a821b5 commit fbcfe63

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

src/internal/client.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3030,14 +3030,14 @@ export class TypedClient {
30303030
if (!isString(prefix)) {
30313031
throw new TypeError('prefix should be of type "string"')
30323032
}
3033-
if (!isString(marker)) {
3033+
if (marker && !isString(marker)) {
30343034
throw new TypeError('marker should be of type "string"')
30353035
}
30363036

30373037
if (listQueryOpts && !isObject(listQueryOpts)) {
30383038
throw new TypeError('listQueryOpts should be of type "object"')
30393039
}
3040-
let { Delimiter, MaxKeys, IncludeVersion } = listQueryOpts as ListObjectQueryOpts
3040+
let { Delimiter, MaxKeys, IncludeVersion, versionIdMarker, keyMarker } = listQueryOpts as ListObjectQueryOpts
30413041

30423042
if (!isString(Delimiter)) {
30433043
throw new TypeError('Delimiter should be of type "string"')
@@ -3056,13 +3056,17 @@ export class TypedClient {
30563056
queries.push(`versions`)
30573057
}
30583058

3059-
if (marker) {
3060-
marker = uriEscape(marker)
3061-
if (IncludeVersion) {
3062-
queries.push(`key-marker=${marker}`)
3063-
} else {
3064-
queries.push(`marker=${marker}`)
3059+
if (IncludeVersion) {
3060+
// v1 version listing..
3061+
if (keyMarker) {
3062+
queries.push(`key-marker=${keyMarker}`)
3063+
}
3064+
if (versionIdMarker) {
3065+
queries.push(`version-id-marker=${versionIdMarker}`)
30653066
}
3067+
} else if (marker) {
3068+
marker = uriEscape(marker)
3069+
queries.push(`marker=${marker}`)
30663070
}
30673071

30683072
// no need to escape maxKeys
@@ -3113,11 +3117,8 @@ export class TypedClient {
31133117
throw new TypeError('listOpts should be of type "object"')
31143118
}
31153119
let marker: string | undefined = ''
3116-
const listQueryOpts = {
3117-
Delimiter: recursive ? '' : '/', // if recursive is false set delimiter to '/'
3118-
MaxKeys: 1000,
3119-
IncludeVersion: listOpts?.IncludeVersion,
3120-
}
3120+
let keyMarker: string | undefined = ''
3121+
let versionIdMarker: string | undefined = ''
31213122
let objects: ObjectInfo[] = []
31223123
let ended = false
31233124
const readStream: stream.Readable = new stream.Readable({ objectMode: true })
@@ -3132,9 +3133,24 @@ export class TypedClient {
31323133
}
31333134

31343135
try {
3136+
const listQueryOpts = {
3137+
Delimiter: recursive ? '' : '/', // if recursive is false set delimiter to '/'
3138+
MaxKeys: 1000,
3139+
IncludeVersion: listOpts?.IncludeVersion,
3140+
// version listing specific options
3141+
keyMarker: keyMarker,
3142+
versionIdMarker: versionIdMarker,
3143+
}
3144+
31353145
const result: ListObjectQueryRes = await this.listObjectsQuery(bucketName, prefix, marker, listQueryOpts)
31363146
if (result.isTruncated) {
3137-
marker = result.nextMarker || result.versionIdMarker
3147+
marker = result.nextMarker || undefined
3148+
if (result.keyMarker) {
3149+
keyMarker = result.keyMarker
3150+
}
3151+
if (result.versionIdMarker) {
3152+
versionIdMarker = result.versionIdMarker
3153+
}
31383154
} else {
31393155
ended = true
31403156
}

src/internal/type.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,14 +498,19 @@ export type ObjectInfo = {
498498
export type ListObjectQueryRes = {
499499
isTruncated?: boolean
500500
nextMarker?: string
501-
versionIdMarker?: string
502501
objects?: ObjectInfo[]
502+
// version listing
503+
keyMarker?: string
504+
versionIdMarker?: string
503505
}
504506

505507
export type ListObjectQueryOpts = {
506508
Delimiter?: string
507509
MaxKeys?: number
508510
IncludeVersion?: boolean
511+
// version listing
512+
keyMarker?: string
513+
versionIdMarker?: string
509514
}
510515
/** List object api types **/
511516

@@ -539,4 +544,5 @@ export interface ListBucketResultV1 {
539544
DeleteMarker?: ObjectRowEntry[]
540545
VersionIdMarker?: string
541546
NextVersionIdMarker?: string
547+
NextMarker?: string
542548
}

src/internal/xml-parser.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -666,14 +666,21 @@ const formatObjInfo = (content: ObjectRowEntry, opts: { IsDeleteMarker?: boolean
666666

667667
// parse XML response for list objects in a bucket
668668
export function parseListObjects(xml: string) {
669-
const result: { objects: ObjectInfo[]; isTruncated?: boolean; nextMarker?: string; versionIdMarker?: string } = {
669+
const result: {
670+
objects: ObjectInfo[]
671+
isTruncated?: boolean
672+
nextMarker?: string
673+
versionIdMarker?: string
674+
keyMarker?: string
675+
} = {
670676
objects: [],
671677
isTruncated: false,
672678
nextMarker: undefined,
673679
versionIdMarker: undefined,
680+
keyMarker: undefined,
674681
}
675682
let isTruncated = false
676-
let nextMarker, nextVersionKeyMarker
683+
let nextMarker
677684
const xmlobj = fxpWithoutNumParser.parse(xml)
678685

679686
const parseCommonPrefixesEntity = (commonPrefixEntry: CommonPrefix[]) => {
@@ -703,6 +710,9 @@ export function parseListObjects(xml: string) {
703710

704711
if (listBucketResult.Marker) {
705712
nextMarker = listBucketResult.Marker
713+
}
714+
if (listBucketResult.NextMarker) {
715+
nextMarker = listBucketResult.NextMarker
706716
} else if (isTruncated && result.objects.length > 0) {
707717
nextMarker = result.objects[result.objects.length - 1]?.name
708718
}
@@ -728,7 +738,7 @@ export function parseListObjects(xml: string) {
728738
}
729739

730740
if (listVersionsResult.NextKeyMarker) {
731-
nextVersionKeyMarker = listVersionsResult.NextKeyMarker
741+
result.keyMarker = listVersionsResult.NextKeyMarker
732742
}
733743
if (listVersionsResult.NextVersionIdMarker) {
734744
result.versionIdMarker = listVersionsResult.NextVersionIdMarker
@@ -740,7 +750,7 @@ export function parseListObjects(xml: string) {
740750

741751
result.isTruncated = isTruncated
742752
if (isTruncated) {
743-
result.nextMarker = nextVersionKeyMarker || nextMarker
753+
result.nextMarker = nextMarker
744754
}
745755
return result
746756
}

0 commit comments

Comments
 (0)