@@ -287,7 +287,7 @@ static int do_http_call(HTTP_STACK_OP& op, const ClientOptions& options,
287287}
288288
289289static int verify_crc64_if_needed (HTTP_STACK_OP & op, std::string_view object,
290- uint64_t * expected_crc64) {
290+ const uint64_t * expected_crc64) {
291291 if (!expected_crc64) return 0 ;
292292 auto it = op.resp .headers .find (" x-oss-hash-crc64ecma" );
293293 if (it == op.resp .headers .end ()) {
@@ -337,6 +337,7 @@ class OssClientImpl : public Client {
337337
338338 int fill_meta (HTTP_STACK_OP & op, ObjectMeta& meta);
339339 int fill_meta (HTTP_STACK_OP & op, ObjectHeaderMeta& meta);
340+ int fill_upload_response (HTTP_STACK_OP & op, ObjectUploadOptions& opts);
340341
341342 ssize_t get_object_range (std::string_view object, const struct iovec * iov,
342343 int iovcnt, off_t offset,
@@ -345,24 +346,24 @@ class OssClientImpl : public Client {
345346 int batch_get_objects (std::vector<GetObjectParameters>& params);
346347
347348 ssize_t put_object (std::string_view object, const struct iovec * iov,
348- int iovcnt, uint64_t * expected_crc64 = nullptr );
349+ int iovcnt, ObjectUploadOptions& opts );
349350
350351 ssize_t append_object (std::string_view object, const struct iovec * iov,
351352 int iovcnt, off_t position,
352- uint64_t * expected_crc64 = nullptr );
353+ ObjectUploadOptions& opts );
353354
354355 int copy_object (std::string_view src_object, std::string_view dst_object,
355356 bool overwrite = false , bool set_mime = false );
356357
357358 int init_multipart_upload (std::string_view object, void ** context);
358359
359360 ssize_t upload_part (void * context, const struct iovec * iov, int iovcnt,
360- int part_number, uint64_t * expected_crc64 = nullptr );
361+ int part_number, ObjectUploadOptions& opts );
361362
362363 int upload_part_copy (void * context, off_t offset, size_t count,
363364 int part_number, std::string_view from = {});
364365
365- int complete_multipart_upload (void * context, uint64_t * expected_crc64 );
366+ int complete_multipart_upload (void * context, ObjectUploadOptions& opts );
366367
367368 int abort_multipart_upload (void * context);
368369
@@ -849,6 +850,17 @@ int OssClient::fill_meta(HTTP_STACK_OP& op, ObjectMeta& meta) {
849850 return 0 ;
850851}
851852
853+ int OssClient::fill_upload_response (HTTP_STACK_OP & op,
854+ ObjectUploadOptions& opts) {
855+ if (opts.etag ) {
856+ auto it = op.resp .headers .find (" ETag" );
857+ if (it != op.resp .headers .end ()) {
858+ opts.etag ->assign (it.second ().data (), it.second ().size ());
859+ }
860+ }
861+ return 0 ;
862+ }
863+
852864ssize_t OssClient::get_object_range (std::string_view obj_path,
853865 const struct iovec * iov, int iovcnt,
854866 off_t offset, ObjectHeaderMeta* meta) {
@@ -1200,7 +1212,7 @@ int OssClient::batch_get_objects(std::vector<GetObjectParameters>& params) {
12001212}
12011213
12021214ssize_t OssClient::put_object (std::string_view object, const struct iovec * iov,
1203- int iovcnt, uint64_t * expected_crc64 ) {
1215+ int iovcnt, ObjectUploadOptions& opts ) {
12041216 iovector_view view ((struct iovec *)iov, iovcnt);
12051217 auto cnt = view.sum ();
12061218
@@ -1215,14 +1227,15 @@ ssize_t OssClient::put_object(std::string_view object, const struct iovec* iov,
12151227 op.body_writer = {&view, &body_writer_cb};
12161228 int r = sign_and_call (op, Verb::PUT , oss_url);
12171229 if (r < 0 ) return r;
1218- r = verify_crc64_if_needed (op, oss_url.object (), expected_crc64);
1230+ r = verify_crc64_if_needed (op, oss_url.object (), opts. expected_crc64 );
12191231 if (r < 0 ) return r;
1232+ fill_upload_response (op, opts);
12201233 return cnt;
12211234}
12221235
12231236ssize_t OssClient::append_object (std::string_view object,
12241237 const struct iovec * iov, int iovcnt,
1225- off_t position, uint64_t * expected_crc64 ) {
1238+ off_t position, ObjectUploadOptions& opts ) {
12261239 iovector_view view ((struct iovec *)iov, iovcnt);
12271240 auto cnt = view.sum ();
12281241
@@ -1244,8 +1257,9 @@ ssize_t OssClient::append_object(std::string_view object,
12441257 op.body_writer = {&view, &body_writer_cb};
12451258 int r = sign_and_call (op, Verb::POST , oss_url, query_params);
12461259 if (r < 0 ) return r;
1247- r = verify_crc64_if_needed (op, oss_url.object (), expected_crc64);
1260+ r = verify_crc64_if_needed (op, oss_url.object (), opts. expected_crc64 );
12481261 if (r < 0 ) return r;
1262+ fill_upload_response (op, opts);
12491263 return cnt;
12501264}
12511265
@@ -1297,7 +1311,7 @@ int OssClient::init_multipart_upload(std::string_view object, void** context) {
12971311
12981312ssize_t OssClient::upload_part (void * context, const struct iovec * iov,
12991313 int iovcnt, int part_number,
1300- uint64_t * expected_crc64 ) {
1314+ ObjectUploadOptions& opts ) {
13011315 iovector_view view ((struct iovec *)iov, iovcnt);
13021316 auto cnt = view.sum ();
13031317 assert (cnt > 0 );
@@ -1327,7 +1341,7 @@ ssize_t OssClient::upload_part(void* context, const struct iovec* iov,
13271341 if (etag.empty ())
13281342 LOG_ERROR_RETURN (EINVAL , -1 , " unexpected response with empty etag" );
13291343
1330- r = verify_crc64_if_needed (op, oss_url.object (), expected_crc64);
1344+ r = verify_crc64_if_needed (op, oss_url.object (), opts. expected_crc64 );
13311345 if (r < 0 ) return r;
13321346
13331347 SCOPED_LOCK (ctx->lock );
@@ -1381,7 +1395,7 @@ int OssClient::upload_part_copy(void* context, off_t offset, size_t count,
13811395}
13821396
13831397int OssClient::complete_multipart_upload (void * context,
1384- uint64_t * expected_crc64 ) {
1398+ ObjectUploadOptions& opts ) {
13851399 assert (context);
13861400
13871401 oss_multipart_context* ctx = (oss_multipart_context*)context;
@@ -1420,7 +1434,10 @@ int OssClient::complete_multipart_upload(void* context,
14201434 op.body_writer = {&view, &body_writer_cb};
14211435 int r = sign_and_call (op, Verb::POST , oss_url, query_params);
14221436 if (r < 0 ) return r;
1423- return verify_crc64_if_needed (op, oss_url.object (), expected_crc64);
1437+ r = verify_crc64_if_needed (op, oss_url.object (), opts.expected_crc64 );
1438+ if (r < 0 ) return r;
1439+ fill_upload_response (op, opts);
1440+ return r;
14241441}
14251442
14261443int OssClient::abort_multipart_upload (void * context) {
0 commit comments