Skip to content

Commit 89d44db

Browse files
authored
YQ-3152 fix error failed to execute callable ResWrite! (#6939)
1 parent dca55a5 commit 89d44db

16 files changed

+91
-60
lines changed

ydb/core/external_sources/object_storage.cpp

+13-8
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
#include <ydb/core/protos/flat_scheme_op.pb.h>
1111
#include <ydb/library/yql/providers/common/http_gateway/yql_http_gateway.h>
1212
#include <ydb/library/yql/providers/common/provider/yql_provider_names.h>
13+
#include <ydb/library/yql/providers/common/structured_token/yql_token_builder.h>
1314
#include <ydb/library/yql/providers/s3/credentials/credentials.h>
1415
#include <ydb/library/yql/providers/s3/object_listers/yql_s3_list.h>
1516
#include <ydb/library/yql/providers/s3/path_generator/yql_s3_path_generator.h>
17+
#include <ydb/library/yql/providers/s3/proto/credentials.pb.h>
1618
#include <ydb/public/api/protos/ydb_status_codes.pb.h>
1719
#include <ydb/public/sdk/cpp/client/ydb_value/value.h>
1820

@@ -284,12 +286,13 @@ struct TObjectStorageExternalSource : public IExternalSource {
284286
return NThreading::MakeFuture(std::move(meta));
285287
}
286288

287-
NYql::TS3Credentials::TAuthInfo authInfo{};
289+
NYql::TStructuredTokenBuilder structuredTokenBuilder;
288290
if (std::holds_alternative<NAuth::TAws>(meta->Auth)) {
289291
auto& awsAuth = std::get<NAuth::TAws>(meta->Auth);
290-
authInfo.AwsAccessKey = awsAuth.AccessKey;
291-
authInfo.AwsAccessSecret = awsAuth.SecretAccessKey;
292-
authInfo.AwsRegion = awsAuth.Region;
292+
NYql::NS3::TAwsParams params;
293+
params.SetAwsAccessKey(awsAuth.AccessKey);
294+
params.SetAwsRegion(awsAuth.Region);
295+
structuredTokenBuilder.SetBasicAuth(params.SerializeAsString(), awsAuth.SecretAccessKey);
293296
} else if (std::holds_alternative<NAuth::TServiceAccount>(meta->Auth)) {
294297
if (!CredentialsFactory) {
295298
try {
@@ -299,15 +302,17 @@ struct TObjectStorageExternalSource : public IExternalSource {
299302
}
300303
}
301304
auto& saAuth = std::get<NAuth::TServiceAccount>(meta->Auth);
302-
NYql::GetAuthInfo(CredentialsFactory, "");
303-
authInfo.Token = CredentialsFactory->Create(saAuth.ServiceAccountId, saAuth.ServiceAccountIdSignature)->CreateProvider()->GetAuthInfo();
305+
structuredTokenBuilder.SetServiceAccountIdAuth(saAuth.ServiceAccountId, saAuth.ServiceAccountIdSignature);
306+
} else {
307+
structuredTokenBuilder.SetNoAuth();
304308
}
305309

310+
const NYql::TS3Credentials credentials(CredentialsFactory, structuredTokenBuilder.ToJson());
306311
auto httpGateway = NYql::IHTTPGateway::Make();
307312
auto httpRetryPolicy = NYql::GetHTTPDefaultRetryPolicy(NYql::THttpRetryPolicyOptions{.RetriedCurlCodes = NYql::FqRetriedCurlCodes()});
308313
auto s3Lister = NYql::NS3Lister::MakeS3Lister(httpGateway, httpRetryPolicy, NYql::NS3Lister::TListingRequest{
309314
.Url = meta->DataSourceLocation,
310-
.AuthInfo = authInfo,
315+
.Credentials = credentials,
311316
.Pattern = meta->TableLocation,
312317
}, Nothing(), false);
313318
auto afterListing = s3Lister->Next().Apply([path = meta->TableLocation](const NThreading::TFuture<NYql::NS3Lister::TListResult>& listResFut) {
@@ -332,7 +337,7 @@ struct TObjectStorageExternalSource : public IExternalSource {
332337
meta->DataSourceLocation,
333338
httpGateway,
334339
NYql::IHTTPGateway::TRetryPolicy::GetNoRetryPolicy(),
335-
std::move(authInfo)
340+
credentials
336341
));
337342

338343
meta->Attributes.erase("withinfer");

ydb/core/external_sources/object_storage/inference/ut/arrow_inference_ut.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class ArrowInferenceTest : public testing::Test {
4545
BaseUrl,
4646
Gateway,
4747
NYql::IHTTPGateway::TRetryPolicy::GetNoRetryPolicy(),
48-
NYql::TS3Credentials::TAuthInfo{}), 1);
48+
NYql::TS3Credentials{}), 1);
4949
}
5050

5151
NActors::TActorId RegisterInferencinator(TStringBuf formatStr) {

ydb/core/external_sources/object_storage/s3_fetcher.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ class S3Fetcher : public NActors::TActorBootstrapped<S3Fetcher> {
1010
TString url,
1111
NYql::IHTTPGateway::TPtr gateway,
1212
NYql::IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
13-
NYql::TS3Credentials::TAuthInfo authInfo)
13+
const NYql::TS3Credentials& credentials)
1414
: Url_{std::move(url)}
1515
, Gateway_{std::move(gateway)}
1616
, RetryPolicy_{std::move(retryPolicy)}
17-
, AuthInfo_{std::move(authInfo)}
17+
, Credentials_(credentials)
1818
{}
1919

2020
void Bootstrap() {
@@ -60,12 +60,13 @@ class S3Fetcher : public NActors::TActorBootstrapped<S3Fetcher> {
6060

6161
void StartDownload(std::shared_ptr<TEvRequestS3Range>&& request, NActors::TActorSystem* actorSystem) {
6262
auto length = request->End - request->Start;
63+
const auto& authInfo = Credentials_.GetAuthInfo();
6364
auto headers = NYql::IHTTPGateway::MakeYcHeaders(
6465
request->RequestId.AsGuidString(),
65-
AuthInfo_.GetToken(),
66+
authInfo.GetToken(),
6667
{},
67-
AuthInfo_.GetAwsUserPwd(),
68-
AuthInfo_.GetAwsSigV4()
68+
authInfo.GetAwsUserPwd(),
69+
authInfo.GetAwsSigV4()
6970
);
7071

7172
Gateway_->Download(
@@ -79,15 +80,15 @@ class S3Fetcher : public NActors::TActorBootstrapped<S3Fetcher> {
7980
TString Url_;
8081
NYql::IHTTPGateway::TPtr Gateway_;
8182
NYql::IHTTPGateway::TRetryPolicy::TPtr RetryPolicy_;
82-
NYql::TS3Credentials::TAuthInfo AuthInfo_;
83+
const NYql::TS3Credentials Credentials_;
8384
};
8485

8586
NActors::IActor* CreateS3FetcherActor(
8687
TString url,
8788
NYql::IHTTPGateway::TPtr gateway,
8889
NYql::IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
89-
NYql::TS3Credentials::TAuthInfo authInfo) {
90+
const NYql::TS3Credentials& credentials) {
9091

91-
return new S3Fetcher(std::move(url), std::move(gateway), std::move(retryPolicy), std::move(authInfo));
92+
return new S3Fetcher(std::move(url), std::move(gateway), std::move(retryPolicy), credentials);
9293
}
9394
} // namespace NKikimr::NExternalSource::NObjectStorage

ydb/core/external_sources/object_storage/s3_fetcher.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ NActors::IActor* CreateS3FetcherActor(
1313
TString url,
1414
NYql::IHTTPGateway::TPtr gateway,
1515
NYql::IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
16-
NYql::TS3Credentials::TAuthInfo authInfo);
16+
const NYql::TS3Credentials& credentials);
1717
} // namespace NKikimr::NExternalSource::NObjectStorage

ydb/library/yql/providers/s3/actors/yql_s3_raw_read_actor.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class TS3ReadActor : public NActors::TActorBootstrapped<TS3ReadActor>, public ID
4242
IHTTPGateway::TPtr gateway,
4343
const NKikimr::NMiniKQL::THolderFactory& holderFactory,
4444
const TString& url,
45-
const TS3Credentials::TAuthInfo& authInfo,
45+
const TS3Credentials& credentials,
4646
const TString& pattern,
4747
NYql::NS3Lister::ES3PatternVariant patternVariant,
4848
NYql::NS3Details::TPathList&& paths,
@@ -69,7 +69,7 @@ class TS3ReadActor : public NActors::TActorBootstrapped<TS3ReadActor>, public ID
6969
, RetryPolicy(retryPolicy)
7070
, ActorSystem(NActors::TActivationContext::ActorSystem())
7171
, Url(url)
72-
, AuthInfo(authInfo)
72+
, Credentials(credentials)
7373
, Pattern(pattern)
7474
, PatternVariant(patternVariant)
7575
, Paths(std::move(paths))
@@ -113,7 +113,7 @@ class TS3ReadActor : public NActors::TActorBootstrapped<TS3ReadActor>, public ID
113113
Gateway,
114114
RetryPolicy,
115115
Url,
116-
AuthInfo,
116+
Credentials,
117117
Pattern,
118118
PatternVariant,
119119
NYql::NS3Lister::ES3PatternType::Wildcard));
@@ -164,10 +164,11 @@ class TS3ReadActor : public NActors::TActorBootstrapped<TS3ReadActor>, public ID
164164
auto url = Url + object.GetPath();
165165
auto id = object.GetPathIndex();
166166
const TString requestId = CreateGuidAsString();
167+
const auto& authInfo = Credentials.GetAuthInfo();
167168
LOG_D("TS3ReadActor", "Download: " << url << ", ID: " << id << ", request id: [" << requestId << "]");
168169
Gateway->Download(
169170
UrlEscapeRet(url, true),
170-
IHTTPGateway::MakeYcHeaders(requestId, AuthInfo.GetToken(), {}, AuthInfo.GetAwsUserPwd(), AuthInfo.GetAwsSigV4()),
171+
IHTTPGateway::MakeYcHeaders(requestId, authInfo.GetToken(), {}, authInfo.GetAwsUserPwd(), authInfo.GetAwsSigV4()),
171172
0U,
172173
std::min(object.GetSize(), SizeLimit),
173174
std::bind(&TS3ReadActor::OnDownloadFinished, ActorSystem, SelfId(), requestId, std::placeholders::_1, id, object.GetPath()),
@@ -456,7 +457,7 @@ class TS3ReadActor : public NActors::TActorBootstrapped<TS3ReadActor>, public ID
456457
NActors::TActorSystem* const ActorSystem;
457458

458459
const TString Url;
459-
const TS3Credentials::TAuthInfo AuthInfo;
460+
const TS3Credentials Credentials;
460461
const TString Pattern;
461462
const NYql::NS3Lister::ES3PatternVariant PatternVariant;
462463
NYql::NS3Details::TPathList Paths;
@@ -503,7 +504,7 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, NActors::IActor*> CreateRawRead
503504
IHTTPGateway::TPtr gateway,
504505
const NKikimr::NMiniKQL::THolderFactory& holderFactory,
505506
const TString& url,
506-
const TS3Credentials::TAuthInfo& authInfo,
507+
const TS3Credentials& credentials,
507508
const TString& pattern,
508509
NYql::NS3Lister::ES3PatternVariant patternVariant,
509510
NYql::NS3Details::TPathList&& paths,
@@ -527,14 +528,14 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, NActors::IActor*> CreateRawRead
527528
statsLevel,
528529
txId,
529530
std::move(gateway),
530-
holderFactory,
531-
url,
532-
authInfo,
531+
holderFactory,
532+
url,
533+
credentials,
533534
pattern,
534535
patternVariant,
535536
std::move(paths),
536537
addPathIndex,
537-
computeActorId,
538+
computeActorId,
538539
sizeLimit,
539540
retryPolicy,
540541
readActorFactoryCfg,

ydb/library/yql/providers/s3/actors/yql_s3_raw_read_actor.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, NActors::IActor*> CreateRawRead
2020
IHTTPGateway::TPtr gateway,
2121
const NKikimr::NMiniKQL::THolderFactory& holderFactory,
2222
const TString& url,
23-
const TS3Credentials::TAuthInfo& authInfo,
23+
const TS3Credentials& credentials,
2424
const TString& pattern,
2525
NYql::NS3Lister::ES3PatternVariant patternVariant,
2626
NYql::NS3Details::TPathList&& paths,

ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,7 @@ class TS3StreamReadActor : public TActorBootstrapped<TS3StreamReadActor>, public
11971197
IHTTPGateway::TPtr gateway,
11981198
const NKikimr::NMiniKQL::THolderFactory& holderFactory,
11991199
const TString& url,
1200-
const TS3Credentials::TAuthInfo& authInfo,
1200+
const TS3Credentials& credentials,
12011201
const TString& pattern,
12021202
ES3PatternVariant patternVariant,
12031203
TPathList&& paths,
@@ -1226,7 +1226,7 @@ class TS3StreamReadActor : public TActorBootstrapped<TS3StreamReadActor>, public
12261226
, ComputeActorId(computeActorId)
12271227
, RetryPolicy(retryPolicy)
12281228
, Url(url)
1229-
, AuthInfo(authInfo)
1229+
, Credentials(credentials)
12301230
, Pattern(pattern)
12311231
, PatternVariant(patternVariant)
12321232
, Paths(std::move(paths))
@@ -1317,7 +1317,7 @@ class TS3StreamReadActor : public TActorBootstrapped<TS3StreamReadActor>, public
13171317
Gateway,
13181318
RetryPolicy,
13191319
Url,
1320-
AuthInfo,
1320+
Credentials,
13211321
Pattern,
13221322
PatternVariant,
13231323
ES3PatternType::Wildcard));
@@ -1381,10 +1381,11 @@ class TS3StreamReadActor : public TActorBootstrapped<TS3StreamReadActor>, public
13811381
<< pathIndex);
13821382

13831383
TActorId actorId;
1384+
const auto& authInfo = Credentials.GetAuthInfo();
13841385
auto stuff = std::make_shared<TRetryStuff>(
13851386
Gateway,
13861387
Url + object.GetPath(),
1387-
IHTTPGateway::MakeYcHeaders(requestId, AuthInfo.GetToken(), {}, AuthInfo.GetAwsUserPwd(), AuthInfo.GetAwsSigV4()),
1388+
IHTTPGateway::MakeYcHeaders(requestId, authInfo.GetToken(), {}, authInfo.GetAwsUserPwd(), authInfo.GetAwsSigV4()),
13881389
object.GetSize(),
13891390
TxId,
13901391
requestId,
@@ -1782,7 +1783,7 @@ class TS3StreamReadActor : public TActorBootstrapped<TS3StreamReadActor>, public
17821783
const IHTTPGateway::TRetryPolicy::TPtr RetryPolicy;
17831784

17841785
const TString Url;
1785-
const TS3Credentials::TAuthInfo AuthInfo;
1786+
const TS3Credentials Credentials;
17861787
const TString Pattern;
17871788
const ES3PatternVariant PatternVariant;
17881789
TPathList Paths;
@@ -1996,7 +1997,7 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, IActor*> CreateS3ReadActor(
19961997
ReadPathsList(params, taskParams, readRanges, paths);
19971998

19981999
const auto token = secureParams.Value(params.GetToken(), TString{});
1999-
const auto authInfo = GetAuthInfo(credentialsFactory, token);
2000+
const TS3Credentials credentials(credentialsFactory, token);
20002001

20012002
const auto& settings = params.GetSettings();
20022003
TString pathPattern = "*";
@@ -2173,7 +2174,7 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, IActor*> CreateS3ReadActor(
21732174
sizeLimit = FromString<ui64>(it->second);
21742175
}
21752176

2176-
const auto actor = new TS3StreamReadActor(inputIndex, statsLevel, txId, std::move(gateway), holderFactory, params.GetUrl(), authInfo, pathPattern, pathPatternVariant,
2177+
const auto actor = new TS3StreamReadActor(inputIndex, statsLevel, txId, std::move(gateway), holderFactory, params.GetUrl(), credentials, pathPattern, pathPatternVariant,
21772178
std::move(paths), addPathIndex, readSpec, computeActorId, retryPolicy,
21782179
cfg, counters, taskCounters, fileSizeLimit, sizeLimit, rowsLimitHint, memoryQuotaManager,
21792180
params.GetUseRuntimeListing(), fileQueueActor, fileQueueBatchSizeLimit, fileQueueBatchObjectCountLimit, fileQueueConsumersCountDelta,
@@ -2185,7 +2186,7 @@ std::pair<NYql::NDq::IDqComputeActorAsyncInput*, IActor*> CreateS3ReadActor(
21852186
if (const auto it = settings.find("sizeLimit"); settings.cend() != it)
21862187
sizeLimit = FromString<ui64>(it->second);
21872188

2188-
return CreateRawReadActor(inputIndex, statsLevel, txId, std::move(gateway), holderFactory, params.GetUrl(), authInfo, pathPattern, pathPatternVariant,
2189+
return CreateRawReadActor(inputIndex, statsLevel, txId, std::move(gateway), holderFactory, params.GetUrl(), credentials, pathPattern, pathPatternVariant,
21892190
std::move(paths), addPathIndex, computeActorId, sizeLimit, retryPolicy,
21902191
cfg, counters, taskCounters, fileSizeLimit, rowsLimitHint,
21912192
params.GetUseRuntimeListing(), fileQueueActor, fileQueueBatchSizeLimit, fileQueueBatchObjectCountLimit, fileQueueConsumersCountDelta);

ydb/library/yql/providers/s3/actors/yql_s3_read_actor.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ NActors::IActor* CreateS3FileQueueActor(
2727
IHTTPGateway::TPtr gateway,
2828
IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
2929
TString url,
30-
TS3Credentials::TAuthInfo authInfo,
30+
const TS3Credentials& credentials,
3131
TString pattern,
3232
NYql::NS3Lister::ES3PatternVariant patternVariant,
3333
NS3Lister::ES3PatternType patternType);

ydb/library/yql/providers/s3/actors/yql_s3_source_queue.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class TS3FileQueueActor : public NActors::TActorBootstrapped<TS3FileQueueActor>
173173
IHTTPGateway::TPtr gateway,
174174
IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
175175
TString url,
176-
TS3Credentials::TAuthInfo authInfo,
176+
const TS3Credentials& credentials,
177177
TString pattern,
178178
NS3Lister::ES3PatternVariant patternVariant,
179179
NS3Lister::ES3PatternType patternType)
@@ -189,7 +189,7 @@ class TS3FileQueueActor : public NActors::TActorBootstrapped<TS3FileQueueActor>
189189
, Gateway(std::move(gateway))
190190
, RetryPolicy(std::move(retryPolicy))
191191
, Url(std::move(url))
192-
, AuthInfo(std::move(authInfo))
192+
, Credentials(credentials)
193193
, Pattern(std::move(pattern))
194194
, PatternVariant(patternVariant)
195195
, PatternType(patternType) {
@@ -493,7 +493,7 @@ class TS3FileQueueActor : public NActors::TActorBootstrapped<TS3FileQueueActor>
493493
RetryPolicy,
494494
NS3Lister::TListingRequest{
495495
Url,
496-
AuthInfo,
496+
Credentials,
497497
PatternVariant == NS3Lister::ES3PatternVariant::PathPattern
498498
? Pattern
499499
: TStringBuilder{} << object.GetPath() << Pattern,
@@ -616,7 +616,7 @@ class TS3FileQueueActor : public NActors::TActorBootstrapped<TS3FileQueueActor>
616616
const IHTTPGateway::TPtr Gateway;
617617
const IHTTPGateway::TRetryPolicy::TPtr RetryPolicy;
618618
const TString Url;
619-
const TS3Credentials::TAuthInfo AuthInfo;
619+
const TS3Credentials Credentials;
620620
const TString Pattern;
621621
const NS3Lister::ES3PatternVariant PatternVariant;
622622
const NS3Lister::ES3PatternType PatternType;
@@ -638,7 +638,7 @@ NActors::IActor* CreateS3FileQueueActor(
638638
IHTTPGateway::TPtr gateway,
639639
IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
640640
TString url,
641-
TS3Credentials::TAuthInfo authInfo,
641+
const TS3Credentials& credentials,
642642
TString pattern,
643643
NS3Lister::ES3PatternVariant patternVariant,
644644
NS3Lister::ES3PatternType patternType) {
@@ -655,7 +655,7 @@ NActors::IActor* CreateS3FileQueueActor(
655655
gateway,
656656
retryPolicy,
657657
url,
658-
authInfo,
658+
credentials,
659659
pattern,
660660
patternVariant,
661661
patternType

ydb/library/yql/providers/s3/actors/yql_s3_source_queue.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ NActors::IActor* CreateS3FileQueueActor(
2424
IHTTPGateway::TPtr gateway,
2525
IHTTPGateway::TRetryPolicy::TPtr retryPolicy,
2626
TString url,
27-
TS3Credentials::TAuthInfo authInfo,
27+
const TS3Credentials& credentials,
2828
TString pattern,
2929
NYql::NS3Lister::ES3PatternVariant patternVariant,
3030
NS3Lister::ES3PatternType patternType);

ydb/library/yql/providers/s3/credentials/credentials.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
namespace NYql {
77

88
TS3Credentials::TS3Credentials(ISecuredServiceAccountCredentialsFactory::TPtr factory, const TString& structuredTokenJson, bool addBearerToToken)
9+
: StructuredTokenJson(structuredTokenJson)
910
{
1011
if (NYql::IsStructuredTokenJson(structuredTokenJson)) {
1112
NYql::TStructuredTokenParser parser = NYql::CreateStructuredTokenParser(structuredTokenJson);
@@ -24,7 +25,7 @@ TS3Credentials::TS3Credentials(ISecuredServiceAccountCredentialsFactory::TPtr fa
2425
}
2526

2627
auto providerFactory = CreateCredentialsProviderFactoryForStructuredToken(factory, structuredTokenJson, addBearerToToken);
27-
CredentialsProvider = providerFactory->CreateProvider();
28+
CredentialsProvider = providerFactory->CreateProvider(); // Heavy operation, BLOCKs thread until TA reply
2829
}
2930

3031
TS3Credentials::TAuthInfo TS3Credentials::GetAuthInfo() const {
@@ -34,6 +35,17 @@ TS3Credentials::TAuthInfo TS3Credentials::GetAuthInfo() const {
3435
return AuthInfo;
3536
}
3637

38+
bool TS3Credentials::operator<(const TS3Credentials& other) const {
39+
return StructuredTokenJson < other.StructuredTokenJson;
40+
}
41+
42+
IOutputStream& operator<<(IOutputStream& stream, const TS3Credentials& credentials) {
43+
const auto& authInfo = credentials.AuthInfo;
44+
return stream << "TS3Credentials{.ServiceAccountAuth=" << static_cast<bool>(credentials.CredentialsProvider)
45+
<< ",.AwsUserPwd=<some token with length" << authInfo.GetAwsUserPwd().length() << ">"
46+
<< ",.AwsSigV4=<some sig with length" << authInfo.GetAwsSigV4().length() << ">}";
47+
}
48+
3749
// string value after AWS prefix should be suitable for passing it to curl as CURLOPT_USERPWD, see details here:
3850
// https://curl.se/libcurl/c/CURLOPT_AWS_SIGV4.html
3951
// CURLOPT_USERPWD = "MY_ACCESS_KEY:MY_SECRET_KEY"

0 commit comments

Comments
 (0)