diff --git a/ydb/library/yql/providers/s3/actors/yql_s3_applicator_actor.cpp b/ydb/library/yql/providers/s3/actors/yql_s3_applicator_actor.cpp index 0493622364b8..53e189430213 100644 --- a/ydb/library/yql/providers/s3/actors/yql_s3_applicator_actor.cpp +++ b/ydb/library/yql/providers/s3/actors/yql_s3_applicator_actor.cpp @@ -83,15 +83,19 @@ struct TListMultipartUploads { } TString BuildUrl() const { + // We have to sort the cgi parameters for the correct aws signature + // This requirement will be fixed in the curl library + // https://github.com/curl/curl/commit/fc76a24c53b08cdf6eec8ba787d8eac64651d56e + // https://github.com/curl/curl/commit/c87920353883ef9d5aa952e724a8e2589d76add5 TUrlBuilder urlBuilder(Url); - urlBuilder.AddUrlParam("uploads"); - urlBuilder.AddUrlParam("prefix", Prefix); if (KeyMarker) { urlBuilder.AddUrlParam("key-marker", KeyMarker); } + urlBuilder.AddUrlParam("prefix", Prefix); if (UploadIdMarker) { urlBuilder.AddUrlParam("upload-id-marker", UploadIdMarker); } + urlBuilder.AddUrlParam("uploads"); return urlBuilder.Build(); } }; @@ -133,11 +137,15 @@ struct TListParts { } TString BuildUrl() const { + // We have to sort the cgi parameters for the correct aws signature + // This requirement will be fixed in the curl library + // https://github.com/curl/curl/commit/fc76a24c53b08cdf6eec8ba787d8eac64651d56e + // https://github.com/curl/curl/commit/c87920353883ef9d5aa952e724a8e2589d76add5 TUrlBuilder urlBuilder(Url); - urlBuilder.AddUrlParam("uploadId", UploadId); if (PartNumberMarker) { urlBuilder.AddUrlParam("part-number-marker", PartNumberMarker); } + urlBuilder.AddUrlParam("uploadId", UploadId); return urlBuilder.Build(); } }; diff --git a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp index 1af3764887c7..f7c568acc869 100644 --- a/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp +++ b/ydb/library/yql/providers/s3/object_listers/yql_s3_list.cpp @@ -287,11 +287,12 @@ class TS3Lister : public IS3Lister { private: static void SubmitRequestIntoGateway(TListingContext& ctx) { IHTTPGateway::THeaders headers = IHTTPGateway::MakeYcHeaders(ctx.RequestId, ctx.ListingRequest.AuthInfo.GetToken(), {}, ctx.ListingRequest.AuthInfo.GetAwsUserPwd(), ctx.ListingRequest.AuthInfo.GetAwsSigV4()); - TUrlBuilder urlBuilder(ctx.ListingRequest.Url); - urlBuilder.AddUrlParam("list-type", "2") - .AddUrlParam("prefix", ctx.ListingRequest.Prefix) - .AddUrlParam("max-keys", TStringBuilder() << ctx.MaxKeys); + // We have to sort the cgi parameters for the correct aws signature + // This requirement will be fixed in the curl library + // https://github.com/curl/curl/commit/fc76a24c53b08cdf6eec8ba787d8eac64651d56e + // https://github.com/curl/curl/commit/c87920353883ef9d5aa952e724a8e2589d76add5 + TUrlBuilder urlBuilder(ctx.ListingRequest.Url); if (ctx.ContinuationToken.Defined()) { urlBuilder.AddUrlParam("continuation-token", *ctx.ContinuationToken); } @@ -299,6 +300,10 @@ class TS3Lister : public IS3Lister { urlBuilder.AddUrlParam("delimiter", *ctx.Delimiter); } + urlBuilder.AddUrlParam("list-type", "2") + .AddUrlParam("max-keys", TStringBuilder() << ctx.MaxKeys) + .AddUrlParam("prefix", ctx.ListingRequest.Prefix); + auto gateway = ctx.GatewayWeak.lock(); if (!gateway) { ythrow yexception() << "Gateway disappeared";