Skip to content

Commit 6a821b5

Browse files
authored
fix tag parsing and type and update validation and tests (#1399)
1 parent d8c6721 commit 6a821b5

File tree

4 files changed

+95
-10
lines changed

4 files changed

+95
-10
lines changed

src/internal/client.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
isEmpty,
4646
isNumber,
4747
isObject,
48+
isPlainObject,
4849
isReadableStream,
4950
isString,
5051
isValidBucketName,
@@ -2239,7 +2240,7 @@ export class TypedClient {
22392240
if (!isValidBucketName(bucketName)) {
22402241
throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName)
22412242
}
2242-
if (!isObject(tags)) {
2243+
if (!isPlainObject(tags)) {
22432244
throw new errors.InvalidArgumentError('tags should be of type "object"')
22442245
}
22452246
if (Object.keys(tags).length > 10) {
@@ -2264,7 +2265,7 @@ export class TypedClient {
22642265
throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName)
22652266
}
22662267

2267-
if (!isObject(tags)) {
2268+
if (!isPlainObject(tags)) {
22682269
throw new errors.InvalidArgumentError('tags should be of type "object"')
22692270
}
22702271
if (Object.keys(tags).length > 10) {

src/internal/helper.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,12 @@ export function isString(arg: unknown): arg is string {
233233
export function isObject(arg: unknown): arg is object {
234234
return typeof arg === 'object' && arg !== null
235235
}
236-
236+
/**
237+
* check if typeof arg is plain object
238+
*/
239+
export function isPlainObject(arg: unknown): arg is Record<string, unknown> {
240+
return Object.prototype.toString.call(arg) === '[object Object]'
241+
}
237242
/**
238243
* check if object is readable stream
239244
*/

src/internal/xml-parser.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type {
1818
ObjectLockInfo,
1919
ObjectRowEntry,
2020
ReplicationConfig,
21+
Tag,
2122
Tags,
2223
} from './type.ts'
2324
import { RETENTION_VALIDITY_UNITS } from './type.ts'
@@ -299,14 +300,14 @@ export function parseObjectLegalHoldConfig(xml: string) {
299300

300301
export function parseTagging(xml: string) {
301302
const xmlObj = parseXml(xml)
302-
let result = []
303+
let result: Tag[] = []
303304
if (xmlObj.Tagging && xmlObj.Tagging.TagSet && xmlObj.Tagging.TagSet.Tag) {
304-
const tagResult = xmlObj.Tagging.TagSet.Tag
305+
const tagResult: Tag = xmlObj.Tagging.TagSet.Tag
305306
// if it is a single tag convert into an array so that the return value is always an array.
306-
if (isObject(tagResult)) {
307-
result.push(tagResult)
307+
if (Array.isArray(tagResult)) {
308+
result = [...tagResult]
308309
} else {
309-
result = tagResult
310+
result.push(tagResult)
310311
}
311312
}
312313
return result

tests/functional/functional-tests.js

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,7 +2459,11 @@ describe('functional tests', function () {
24592459
return done(err)
24602460
}
24612461
if (Array.isArray(tagList)) {
2462-
done()
2462+
const hasNestedArray = tagList.length !== tagList.flat(Infinity).length
2463+
if (hasNestedArray) {
2464+
return done(new Error('TagList is not flat'))
2465+
}
2466+
return done()
24632467
}
24642468
})
24652469
})
@@ -2519,8 +2523,78 @@ describe('functional tests', function () {
25192523
return done(err)
25202524
}
25212525
if (Array.isArray(tagList)) {
2526+
const hasNestedArray = tagList.length !== tagList.flat(Infinity).length
2527+
if (hasNestedArray) {
2528+
return done(new Error('TagList is not flat'))
2529+
}
2530+
return done()
2531+
}
2532+
return done()
2533+
})
2534+
})
2535+
2536+
step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => {
2537+
client.removeObjectTagging(tagsBucketName, tagObjName, (err) => {
2538+
if (err && err.code === 'NotImplemented') {
2539+
return done()
2540+
}
2541+
if (err) {
2542+
return done(err)
2543+
}
2544+
done()
2545+
})
2546+
})
2547+
step(`removeObject object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => {
2548+
client.removeObject(tagsBucketName, tagObjName, () => {
2549+
done()
2550+
})
2551+
})
2552+
})
2553+
2554+
describe('set, get and remove multiple Tags on an object', function () {
2555+
step(
2556+
`putObject(bucketName, objectName, stream)_bucketName:${tagsBucketName}, objectName:${tagObjName}, stream:100Kib_`,
2557+
(done) => {
2558+
client
2559+
.putObject(tagsBucketName, tagObjName, tagObject)
2560+
.then(() => done())
2561+
.catch(done)
2562+
},
2563+
)
2564+
2565+
step(`setObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => {
2566+
client.setObjectTagging(
2567+
tagsBucketName,
2568+
tagObjName,
2569+
{ 'test-tag-key-obj': 'test-tag-value-obj', 'test-tag-key-obj1': 'test-tag-value-obj1' },
2570+
(err) => {
2571+
if (err && err.code === 'NotImplemented') {
2572+
return done()
2573+
}
2574+
if (err) {
2575+
return done(err)
2576+
}
25222577
done()
2578+
},
2579+
)
2580+
})
2581+
2582+
step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => {
2583+
client.getObjectTagging(tagsBucketName, tagObjName, (err, tagList) => {
2584+
if (err && err.code === 'NotImplemented') {
2585+
return done()
2586+
}
2587+
if (err) {
2588+
return done(err)
25232589
}
2590+
if (Array.isArray(tagList)) {
2591+
const hasNestedArray = tagList.length !== tagList.flat(Infinity).length
2592+
if (hasNestedArray) {
2593+
return done(new Error('TagList is not flat'))
2594+
}
2595+
return done()
2596+
}
2597+
return done()
25242598
})
25252599
})
25262600

@@ -2616,7 +2690,11 @@ describe('functional tests', function () {
26162690
return done(err)
26172691
}
26182692
if (Array.isArray(tagList)) {
2619-
done()
2693+
const hasNestedArray = tagList.length !== tagList.flat(Infinity).length
2694+
if (hasNestedArray) {
2695+
return done(new Error('TagList is not flat'))
2696+
}
2697+
return done()
26202698
}
26212699
})
26222700
} else {

0 commit comments

Comments
 (0)