Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package aws-crt-cpp for openSUSE:Factory checked in at 2026-08-14 22:06:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/aws-crt-cpp (Old) and /work/SRC/openSUSE:Factory/.aws-crt-cpp.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "aws-crt-cpp" Fri Aug 14 22:06:21 2026 rev:59 rq:1371013 version:0.43.5 Changes: -------- --- /work/SRC/openSUSE:Factory/aws-crt-cpp/aws-crt-cpp.changes 2026-08-05 19:07:39.691637590 +0200 +++ /work/SRC/openSUSE:Factory/.aws-crt-cpp.new.1258/aws-crt-cpp.changes 2026-08-14 22:06:45.312519220 +0200 @@ -1,0 +2,13 @@ +Thu Aug 13 07:52:42 UTC 2026 - John Paul Adrian Glaubitz <[email protected]> + +- Update to version 0.43.5 + * support opaque etags by @TingDaoK in (#664) + * Combine per-part CRCs for whole-object download checksum + validation by @TingDaoK in (#663) +- from version 0.43.4 + * Use latest as aws-crt-builder version by @sfod in (#660) + * fix resume token build by @TingDaoK in (#661) + * Fixing a typo that breaks a public API, but it only released + 2 days ago and no downstream picks up the latest change. + +------------------------------------------------------------------- Old: ---- v0.43.3.tar.gz New: ---- v0.43.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ aws-crt-cpp.spec ++++++ --- /var/tmp/diff_new_pack.RalTG2/_old 2026-08-14 22:06:46.467560448 +0200 +++ /var/tmp/diff_new_pack.RalTG2/_new 2026-08-14 22:06:46.471560590 +0200 @@ -20,7 +20,7 @@ %define library_soversion 1 Name: aws-crt-cpp -Version: 0.43.3 +Version: 0.43.5 Release: 0 Summary: AWS C++ wrapper for AWS SDK C libraries License: Apache-2.0 ++++++ v0.43.3.tar.gz -> v0.43.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-cpp-0.43.3/VERSION new/aws-crt-cpp-0.43.5/VERSION --- old/aws-crt-cpp-0.43.3/VERSION 2026-07-31 00:33:44.000000000 +0200 +++ new/aws-crt-cpp-0.43.5/VERSION 2026-08-11 19:52:30.000000000 +0200 @@ -1 +1 @@ -0.43.3 +0.43.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-cpp-0.43.3/include/aws/crt/Api.h new/aws-crt-cpp-0.43.5/include/aws/crt/Api.h --- old/aws-crt-cpp-0.43.3/include/aws/crt/Api.h 2026-07-31 00:33:44.000000000 +0200 +++ new/aws-crt-cpp-0.43.5/include/aws/crt/Api.h 2026-08-11 19:52:30.000000000 +0200 @@ -239,6 +239,13 @@ AWS_CRT_CPP_API const char *ErrorDebugString(int error) noexcept; /** + * Gets the name of a CRT error code, e.g. "AWS_ERROR_S3_CANCELED" + * @param error error code to get the name for + * @return the name of the error code, or "Unknown Error Code" if unregistered + */ + AWS_CRT_CPP_API const char *ErrorName(int error) noexcept; + + /** * @return the value of the last aws error on the current thread. Return 0 if no aws-error raised before. */ AWS_CRT_CPP_API int LastError() noexcept; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-cpp-0.43.3/include/aws/crt/s3/S3.h new/aws-crt-cpp-0.43.5/include/aws/crt/s3/S3.h --- old/aws-crt-cpp-0.43.3/include/aws/crt/s3/S3.h 2026-07-31 00:33:44.000000000 +0200 +++ new/aws-crt-cpp-0.43.5/include/aws/crt/s3/S3.h 2026-08-11 19:52:30.000000000 +0200 @@ -232,6 +232,9 @@ /** AWS_ERROR_SUCCESS on success, a CRT error code otherwise. */ int errorCode; + /** True when the meta request completed without error. */ + bool IsSuccess() const noexcept; + /** HTTP status of the request (the successful response on success, or the failed request on an S3 error * response); 0 for other error codes. */ int responseStatus; @@ -568,6 +571,26 @@ struct aws_s3_client_config *GetUnderlyingHandle() const noexcept; /** + * @return the region requests are signed for; "us-east-1" if never set. + */ + String GetRegion() const noexcept { return m_region; } + + /** + * @return the target part size in bytes, or 0 if unset. + */ + uint64_t GetPartSize() const noexcept; + + /** + * @return the multipart-upload threshold in bytes, or 0 if unset. + */ + uint64_t GetMultipartUploadThreshold() const noexcept; + + /** + * @return the target throughput in Gbps, or 0 if unset. + */ + double GetThroughputTargetGbps() const noexcept; + + /** * @return the configured retry-strategy flavor (Default if unset). */ S3RetryStrategyType GetRetryStrategyType() const noexcept { return m_retryStrategyType; } @@ -605,6 +628,14 @@ return m_clientShutdownCallback; } + /** + * @return the credentials provider this config signs with. + */ + std::shared_ptr<Auth::ICredentialsProvider> GetCredentialsProvider() const noexcept + { + return m_credentialsProvider; + } + private: // The CRT C-struct storage (aws_s3_client_config plus the proxy, // TCP keep-alive, and connection-monitoring option backings) lives @@ -646,13 +677,16 @@ class AWS_CRT_CPP_API S3MetaRequestOptions { public: + // Callbacks return bool (continue/abort) so C++ callers don't have to name the C + // AWS_OP_SUCCESS sentinel; the binding translates false to an aborted meta request. + /** * Invoked once per delivered body chunk during a download. * @param body the chunk of object bytes for this delivery. * @param rangeStart byte offset within the object that this chunk starts at. - * @return AWS_OP_SUCCESS to continue, or an error code to abort the meta request. + * @return true to continue the meta request, false to abort it. */ - using BodyCallback = std::function<int(ByteCursor body, uint64_t rangeStart)>; + using BodyCallback = std::function<bool(ByteCursor body, uint64_t rangeStart)>; /** * Like BodyCallback, but the chunk is delivered with a borrowed @@ -662,17 +696,19 @@ * @param body the chunk of object bytes for this delivery. * @param rangeStart byte offset within the object that this chunk starts at. * @param ticket borrowed handle to the CRT-owned buffer holding body. - * @return AWS_OP_SUCCESS to continue, or an error code to abort the meta request. + * @return true to continue the meta request, false to abort it. */ - using BodyCallbackEx = std::function<int(ByteCursor body, uint64_t rangeStart, S3BufferTicket &ticket)>; + using BodyCallbackEx = + std::function<bool(ByteCursor body, uint64_t rangeStart, S3BufferTicket &ticket)>; /** * Invoked once when response headers are available. * @param headers materialized snapshot of the response headers. * @param responseStatus HTTP status code from the response. - * @return AWS_OP_SUCCESS to continue, or an error code to abort the meta request. + * @return true to continue the meta request, false to abort it. */ - using HeadersCallback = std::function<int(const Vector<Http::HttpHeader> &headers, int responseStatus)>; + using HeadersCallback = + std::function<bool(const Vector<Http::HttpHeader> &headers, int responseStatus)>; /** * Invoked periodically as bytes flow. @@ -719,6 +755,27 @@ S3MetaRequestOptions &SetSigningConfig(const Auth::AwsSigningConfig &config) noexcept; /** + * Configure this meta request's signing from a resolved endpoint's auth scheme. The + * config is owned by this options object. Prefer this over SetSigningConfig for + * endpoint-resolved signing, since the S3Express algorithm is not expressible via + * the public SigningAlgorithm enum. + * + * @param region the client region, used as the signing-config base. + * @param signingRegion signing region from the auth scheme, or empty to keep region. + * @param signingName signing service name from the auth scheme, or empty to keep "s3". + * @param isS3Express true for a directory bucket (use V4-S3Express); false for SigV4. + * @param provider the credentials provider used during signing. Required; a null + * provider is recorded as an error and fails MakeMetaRequest. + * @return this object, to allow chaining. + */ + S3MetaRequestOptions &SetSigningConfigFromEndpoint( + const String ®ion, + const String &signingRegion, + const String &signingName, + bool isS3Express, + const std::shared_ptr<Auth::ICredentialsProvider> &provider) noexcept; + + /** * Set the checksum configuration for this meta request. * * @param config the checksum configuration. @@ -1151,9 +1208,47 @@ */ int LastError() const noexcept; + /** + * The four getters below report what this client was constructed with, copied from + * its S3ClientConfig. aws_s3_client is opaque and a config is typically a local that + * dies once construction returns, so a caller handed only the client would otherwise + * have no way to learn how it was configured. + * + * @return the region this client signs requests for. + */ + String GetRegion() const noexcept { return m_region; } + + /** + * @return the target part size in bytes, or 0 if unset. + */ + uint64_t GetPartSize() const noexcept { return m_partSize; } + + /** + * @return the multipart-upload threshold in bytes, or 0 if unset. + */ + uint64_t GetMultipartUploadThreshold() const noexcept { return m_multipartUploadThreshold; } + + /** + * @return the target throughput in Gbps, or 0 if unset. + */ + double GetThroughputTargetGbps() const noexcept { return m_throughputTargetGbps; } + + /** + * @return the credentials provider this client signs with. + */ + std::shared_ptr<Auth::ICredentialsProvider> GetCredentialsProvider() const noexcept + { + return m_credentialsProvider; + } + private: ScopedResource<struct aws_s3_client> m_client; int m_lastError; + String m_region; + uint64_t m_partSize = 0; + uint64_t m_multipartUploadThreshold = 0; + double m_throughputTargetGbps = 0.0; + std::shared_ptr<Auth::ICredentialsProvider> m_credentialsProvider; }; /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-cpp-0.43.3/source/Api.cpp new/aws-crt-cpp-0.43.5/source/Api.cpp --- old/aws-crt-cpp-0.43.3/source/Api.cpp 2026-07-31 00:33:44.000000000 +0200 +++ new/aws-crt-cpp-0.43.5/source/Api.cpp 2026-08-11 19:52:30.000000000 +0200 @@ -461,6 +461,11 @@ return aws_error_debug_str(error); } + const char *ErrorName(int error) noexcept + { + return aws_error_name(error); + } + int LastError() noexcept { return aws_last_error(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-crt-cpp-0.43.3/source/s3/S3.cpp new/aws-crt-cpp-0.43.5/source/s3/S3.cpp --- old/aws-crt-cpp-0.43.3/source/s3/S3.cpp 2026-07-31 00:33:44.000000000 +0200 +++ new/aws-crt-cpp-0.43.5/source/s3/S3.cpp 2026-08-11 19:52:30.000000000 +0200 @@ -23,6 +23,11 @@ { namespace S3 { + bool S3MetaRequestResult::IsSuccess() const noexcept + { + return errorCode == AWS_ERROR_SUCCESS; + } + S3ChecksumConfig::S3ChecksumConfig() noexcept // Trailer + CRC64NVME matches the AWS SDK default. A location // of None disables the algorithm entirely. @@ -146,6 +151,21 @@ return *this; } + uint64_t S3ClientConfig::GetPartSize() const noexcept + { + return m_impl->config.part_size; + } + + uint64_t S3ClientConfig::GetMultipartUploadThreshold() const noexcept + { + return m_impl->config.multipart_upload_threshold; + } + + double S3ClientConfig::GetThroughputTargetGbps() const noexcept + { + return m_impl->config.throughput_target_gbps; + } + S3ClientConfig &S3ClientConfig::SetMemoryLimit(uint64_t bytes) noexcept { m_impl->config.memory_limit_in_bytes = bytes; @@ -270,6 +290,9 @@ { aws_s3_meta_request_options options = {}; aws_s3_checksum_config checksum = {}; + aws_signing_config_aws endpointSigningConfig = {}; + String endpointSigningRegion; + String endpointSigningName; }; S3MetaRequestOptions::S3MetaRequestOptions( @@ -316,6 +339,44 @@ return *this; } + S3MetaRequestOptions &S3MetaRequestOptions::SetSigningConfigFromEndpoint( + const String ®ion, + const String &signingRegion, + const String &signingName, + bool isS3Express, + const std::shared_ptr<Auth::ICredentialsProvider> &provider) noexcept + { + // Required: aws-c-s3's S3Express signing path has no error branch for a config with + // no credentials, so it would stall rather than fail. + if (provider == nullptr) + { + m_lastError = AWS_ERROR_INVALID_ARGUMENT; + return *this; + } + + // Zeroed so a re-set leaves no stale cursors. + aws_signing_config_aws &config = m_impl->endpointSigningConfig; + AWS_ZERO_STRUCT(config); + aws_s3_init_default_signing_config( + &config, ByteCursorFromString(region), provider->GetUnderlyingHandle()); + // S3 requires single URI encoding, or keys with reserved characters fail with + // SignatureDoesNotMatch. + config.flags.use_double_uri_encode = false; + config.algorithm = isS3Express ? AWS_SIGNING_ALGORITHM_V4_S3EXPRESS : AWS_SIGNING_ALGORITHM_V4; + + // Cursors must point into storage this object owns, not the caller's temporaries. + m_impl->endpointSigningRegion = signingRegion.empty() ? region : signingRegion; + config.region = ByteCursorFromString(m_impl->endpointSigningRegion); + if (!signingName.empty()) + { + m_impl->endpointSigningName = signingName; + config.service = ByteCursorFromString(m_impl->endpointSigningName); + } + + m_impl->options.signing_config = &config; + return *this; + } + S3MetaRequestOptions &S3MetaRequestOptions::SetChecksumConfig(const S3ChecksumConfig &config) noexcept { switch (config.GetLocation()) @@ -681,7 +742,12 @@ { return AWS_OP_SUCCESS; } - return data->headersCb(s_materializeHeaders(headers), responseStatus); + if (data->headersCb(s_materializeHeaders(headers), responseStatus)) + { + return AWS_OP_SUCCESS; + } + // Raise before returning: the CRT reads aws_last_error() on a non-zero return. + return aws_raise_error(AWS_ERROR_HTTP_CALLBACK_FAILURE); } static int s_onBody( @@ -691,7 +757,15 @@ void *user_data) { auto *data = static_cast<S3MetaRequestCallbackData *>(user_data); - return data->bodyCb ? data->bodyCb(*body, rangeStart) : AWS_OP_SUCCESS; + if (!data->bodyCb) + { + return AWS_OP_SUCCESS; + } + if (data->bodyCb(*body, rangeStart)) + { + return AWS_OP_SUCCESS; + } + return aws_raise_error(AWS_ERROR_HTTP_CALLBACK_FAILURE); } static int s_onBodyEx( @@ -705,13 +779,14 @@ { return AWS_OP_SUCCESS; } - // Stack-only, non-owning wrapper over the CRT's borrowed ticket - // (which may be null, ex. HEAD_OBJECT): no heap allocation and no - // reference taken on the per-chunk path. If the callback needs the - // buffer past its return, it calls ticket.Acquire(), which is the - // only path that takes a reference and allocates. + // Non-owning wrapper over the CRT's borrowed ticket (may be null, ex. HEAD_OBJECT). + // Takes no reference; the callback calls ticket.Acquire() to outlive its return. S3BufferTicket ticket(info.ticket); - return data->bodyCbEx(*body, info.range_start, ticket); + if (data->bodyCbEx(*body, info.range_start, ticket)) + { + return AWS_OP_SUCCESS; + } + return aws_raise_error(AWS_ERROR_HTTP_CALLBACK_FAILURE); } static void s_onProgress( @@ -812,7 +887,11 @@ Delete(data, ApiAllocator()); } - S3Client::S3Client(const S3ClientConfig &config) noexcept : m_lastError(AWS_ERROR_SUCCESS) + S3Client::S3Client(const S3ClientConfig &config) noexcept + : m_lastError(AWS_ERROR_SUCCESS), m_region(config.GetRegion()), m_partSize(config.GetPartSize()), + m_multipartUploadThreshold(config.GetMultipartUploadThreshold()), + m_throughputTargetGbps(config.GetThroughputTargetGbps()), + m_credentialsProvider(config.GetCredentialsProvider()) { Allocator *allocator = ApiAllocator(); struct aws_s3_client_config *rawConfig = config.GetUnderlyingHandle();
