ADD: MacCloud/S3: step-127: support HeadBucket API in HuaweiOBS

This commit is contained in:
rich2014 2025-05-13 22:20:34 +08:00
commit 1d9bbe474f
3 changed files with 47 additions and 35 deletions

View file

@ -1,7 +1,6 @@
unit uAmazonS3Client;
{$mode ObjFPC}{$H+}
{$modeswitch objectivec2}
interface
@ -9,18 +8,17 @@ uses
Classes, SysUtils,
CocoaAll,
uCloudDriver, uAWSCore, uS3Client,
uMiniHttpClient, uMiniUtil;
uMiniUtil;
type
{ TAmazonS3GetAllBucketsSession }
TAmazonS3GetAllBucketsSession = class( TS3GetAllBucketsSession )
TAmazonS3GetAllBucketsSession = class( TS3GetAllBucketsWithRegionFunctionSession )
protected
procedure constructBucket( const bucket: TS3Bucket; const xmlBucket: NSXMLElement ); override;
function getConnectionDataOfService: TAWSConnectionData; override;
function getEndPointOfRegion(const region: String): String; override;
function getRegionOfBucket(const name: String): String;
end;
{ TAmazonS3Client }
@ -56,34 +54,6 @@ begin
Result:= 's3.' + region + '.amazonaws.com';
end;
function TAmazonS3GetAllBucketsSession.getRegionOfBucket( const name: String ): String;
var
connectionData: TAWSConnectionData;
endPoint: String;
http: TMiniHttpClient = nil;
httpResult: TMiniHttpResult = nil;
cloudDriverResult: TCloudDriverResult = nil;
urlString: String;
begin
try
connectionData:= self.getConnectionDataOfService;
endPoint:= self.getEndPointOfRegion( connectionData.region );
urlString:= 'https://' + name + '.' + endPoint + '/';
http:= TMiniHttpClient.Create( urlString, HttpConst.Method.HEAD );
http.addHeader( AWSConst.HEADER.CONTENT_SHA256, AWSConst.HEADER.CONTENT_SHA256_DEFAULT_VALUE );
_authSession.setAuthHeader( http );
cloudDriverResult:= TCloudDriverResult.Create;
httpResult:= http.connect;
cloudDriverResult.httpResult:= httpResult;
cloudDriverResult.resultMessage:= httpResult.body;
Result:= httpResult.getHeader( AWSConst.HEADER.BUCKET_REGION );
finally
FreeAndNil( cloudDriverResult );
FreeAndNil( http );
end;
end;
{ TAmazonS3Client }
class function TAmazonS3Client.driverName: String;

View file

@ -14,7 +14,7 @@ type
{ THuaweiOBSGetAllBucketsSession }
THuaweiOBSGetAllBucketsSession = class( TS3GetAllBucketsSession )
THuaweiOBSGetAllBucketsSession = class( TS3GetAllBucketsWithRegionFunctionSession )
protected
procedure constructBucket( const bucket: TS3Bucket; const xmlBucket: NSXMLElement ); override;
function getConnectionDataOfService: TAWSConnectionData; override;
@ -38,19 +38,24 @@ implementation
procedure THuaweiOBSGetAllBucketsSession.constructBucket( const bucket: TS3Bucket; const xmlBucket: NSXMLElement );
begin
bucket.connectionData.region:= TXmlUtil.getString( xmlBucket, 'Location' );
if bucket.connectionData.region = EmptyStr then
bucket.connectionData.region:= self.getRegionOfBucket( bucket.connectionData.bucketName );
bucket.connectionData.endPoint:= self.getEndPointOfRegion( bucket.connectionData.region );
end;
function THuaweiOBSGetAllBucketsSession.getConnectionDataOfService: TAWSConnectionData;
begin
Result.region:= 'cn-north-1';
Result.region:= '';
Result.endPoint:= 'obs.myhuaweicloud.com';
Result.bucketName:= '';
end;
function THuaweiOBSGetAllBucketsSession.getEndPointOfRegion( const region: String ): String;
begin
Result:= 'obs.' + region + '.myhuaweicloud.com';
if region = EmptyStr then
Result:= 'obs.myhuaweicloud.com'
else
Result:= 'obs.' + region + '.myhuaweicloud.com';
end;
{ THuaweiOBSClient }

View file

@ -66,6 +66,13 @@ type
function listBuckets: TS3Buckets;
end;
{ TS3GetAllBucketsWithRegionFunctionSession }
TS3GetAllBucketsWithRegionFunctionSession = class( TS3GetAllBucketsSession )
protected
function getRegionOfBucket( const name: String ): String;
end;
{ TS3BucketsLister }
TS3BucketsLister = class( TCloudDriverLister )
@ -683,6 +690,36 @@ begin
end;
end;
{ TS3GetAllBucketsWithRegionFunctionSession }
function TS3GetAllBucketsWithRegionFunctionSession.getRegionOfBucket( const name: String ): String;
var
connectionData: TAWSConnectionData;
endPoint: String;
http: TMiniHttpClient = nil;
httpResult: TMiniHttpResult = nil;
cloudDriverResult: TCloudDriverResult = nil;
urlString: String;
begin
try
connectionData:= self.getConnectionDataOfService;
endPoint:= self.getEndPointOfRegion( connectionData.region );
urlString:= 'https://' + name + '.' + endPoint + '/';
http:= TMiniHttpClient.Create( urlString, HttpConst.Method.HEAD );
http.addHeader( AWSConst.HEADER.CONTENT_SHA256, AWSConst.HEADER.CONTENT_SHA256_DEFAULT_VALUE );
_authSession.setAuthHeader( http );
cloudDriverResult:= TCloudDriverResult.Create;
httpResult:= http.connect;
cloudDriverResult.httpResult:= httpResult;
cloudDriverResult.resultMessage:= httpResult.body;
Result:= httpResult.getHeader( AWSConst.HEADER.BUCKET_REGION );
finally
FreeAndNil( cloudDriverResult );
FreeAndNil( http );
end;
end;
{ TS3BucketsLister }
constructor TS3BucketsLister.Create( const buckets: TS3Buckets );