@@ -3,8 +3,10 @@ import type {
3
3
CreateBucketOptions ,
4
4
DeleteBucketPolicyOptions ,
5
5
GetBucketPolicyOptions ,
6
+ GetBucketPolicyStatusOptions ,
6
7
ListBucketsResponses ,
7
8
Policy ,
9
+ PolicyStatus ,
8
10
PutBucketPolicyOptions ,
9
11
Statement ,
10
12
} from "./types.ts" ;
@@ -231,8 +233,42 @@ export class S3 {
231
233
await resp . arrayBuffer ( ) ;
232
234
}
233
235
234
- #parseListBucketsResponseXml( x : string ) : ListBucketsResponses {
235
- const doc : Document = parseXML ( x ) ;
236
+ async getBucketPolicyStatus (
237
+ bucket : string ,
238
+ options ?: GetBucketPolicyStatusOptions ,
239
+ ) : Promise < PolicyStatus > {
240
+ const headers : Params = { } ;
241
+ const params : Params = { } ;
242
+
243
+ if ( options ?. expectedBucketOwner ) {
244
+ headers [ "x-amz-expected-bucket-owner" ] = options . expectedBucketOwner ;
245
+ }
246
+
247
+ params [ "policyStatus" ] = "true" ;
248
+
249
+ const resp = await doRequest ( {
250
+ host : this . #host,
251
+ signer : this . #signer,
252
+ path : bucket ,
253
+ method : "GET" ,
254
+ headers,
255
+ params,
256
+ } ) ;
257
+
258
+ if ( resp . status !== 200 ) {
259
+ throw new S3Error (
260
+ `Failed to get policy status for bucket "${ bucket } ": ${ resp . status } ${ resp . statusText } ` ,
261
+ await resp . text ( ) ,
262
+ ) ;
263
+ }
264
+
265
+ return this . #parseGetBucketPolicyStatusResult(
266
+ await resp . text ( ) ,
267
+ ) ;
268
+ }
269
+
270
+ #parseListBucketsResponseXml( xml : string ) : ListBucketsResponses {
271
+ const doc : Document = parseXML ( xml ) ;
236
272
const root = extractRoot ( doc , "ListAllMyBucketsResult" ) ;
237
273
const buckets = extractField ( root , "Buckets" ) ! ;
238
274
const owner = extractField ( root , "Owner" ) ! ;
@@ -281,4 +317,12 @@ export class S3 {
281
317
return mapped ;
282
318
}
283
319
}
320
+
321
+ #parseGetBucketPolicyStatusResult( xml : string ) : PolicyStatus {
322
+ const doc : Document = parseXML ( xml ) ;
323
+ const root = extractRoot ( doc , "PolicyStatus" ) ;
324
+ const isPublic =
325
+ extractContent ( root , "IsPublic " ) ?. toLowerCase ( ) === "true" ;
326
+ return { isPublic } ;
327
+ }
284
328
}
0 commit comments