File tree 3 files changed +68
-1
lines changed
3 files changed +68
-1
lines changed Original file line number Diff line number Diff line change 1
1
import { AWSSignerV4 } from "../deps.ts" ;
2
- import type { CreateBucketOptions } from "./types.ts" ;
2
+ import type {
3
+ CreateBucketOptions ,
4
+ HeadBucketOptions ,
5
+ HeadBucketResponse ,
6
+ } from "./types.ts" ;
3
7
import { S3Error } from "./error.ts" ;
4
8
import { S3Bucket } from "./bucket.ts" ;
5
9
import { doRequest , encoder } from "./utils.ts" ;
@@ -28,6 +32,37 @@ export class S3 {
28
32
this . #config = { ...config } ;
29
33
}
30
34
35
+ async headBucket (
36
+ bucket : string ,
37
+ options ?: HeadBucketOptions ,
38
+ ) : Promise < HeadBucketResponse > {
39
+ const headers : Params = { } ;
40
+
41
+ if ( options ?. expectedBucketOwner ) {
42
+ headers [ "x-amz-expected-bucket-owner " ] = options . expectedBucketOwner ;
43
+ }
44
+
45
+ const resp = await doRequest ( {
46
+ host : this . #host,
47
+ signer : this . #signer,
48
+ path : bucket ,
49
+ method : "HEAD" ,
50
+ headers,
51
+ } ) ;
52
+
53
+ if ( resp . status !== 200 ) {
54
+ throw new S3Error (
55
+ `Failed to get bucket "${ bucket } ": ${ resp . status } ${ resp . statusText } ` ,
56
+ await resp . text ( ) ,
57
+ ) ;
58
+ }
59
+
60
+ return {
61
+ bucketRegion : resp . headers . get ( "x-amz-bucket-region" ) ?? undefined ,
62
+ accessPointAlias : resp . headers . get ( "x-amz-access-point-alias" ) === "true" ,
63
+ } ;
64
+ }
65
+
31
66
async createBucket (
32
67
bucket : string ,
33
68
options ?: CreateBucketOptions ,
Original file line number Diff line number Diff line change @@ -11,6 +11,29 @@ const s3 = new S3({
11
11
endpointURL : Deno . env . get ( "S3_ENDPOINT_URL" ) ,
12
12
} ) ;
13
13
14
+ Deno . test ( {
15
+ name : "[client] should get a bucket" ,
16
+ async fn ( ) {
17
+ const resp = await s3 . headBucket ( "test" ) ;
18
+ assertEquals ( resp , {
19
+ bucketRegion : undefined ,
20
+ accessPointAlias : false ,
21
+ } ) ;
22
+ } ,
23
+ } ) ;
24
+
25
+ Deno . test ( {
26
+ name :
27
+ "[client] should throw when getting a bucket if the bucket does not exist" ,
28
+ async fn ( ) {
29
+ await assertThrowsAsync (
30
+ ( ) => s3 . headBucket ( "not-existing-bucket" ) ,
31
+ S3Error ,
32
+ 'Failed to get bucket "not-existing-bucket": 404 Not Found' ,
33
+ ) ;
34
+ } ,
35
+ } ) ;
36
+
14
37
Deno . test ( {
15
38
name : "[client] should create a new bucket" ,
16
39
async fn ( ) {
Original file line number Diff line number Diff line change @@ -537,6 +537,15 @@ export interface DeleteObjectResponse {
537
537
deleteMarker : boolean ;
538
538
}
539
539
540
+ export interface HeadBucketOptions {
541
+ expectedBucketOwner ?: string ;
542
+ }
543
+
544
+ export interface HeadBucketResponse {
545
+ bucketRegion ?: string ;
546
+ accessPointAlias : boolean ;
547
+ }
548
+
540
549
export interface CreateBucketOptions {
541
550
/** The canned ACL to apply to the bucket */
542
551
acl ?:
You can’t perform that action at this time.
0 commit comments