@@ -398,7 +398,7 @@ class OssClientImpl : public Client {
398398 int walk_list_results (const SimpleDOM::Node& node, ListObjectsCallback cb);
399399 int do_list_objects_v2 (std::string_view bucket, std::string_view prefix,
400400 ListObjectsCallback cb, bool delimiters, int maxKeys,
401- std::string* marker);
401+ std::string* marker, std::string_view start_after = {} );
402402 int do_list_objects_v1 (std::string_view bucket, std::string_view prefix,
403403 ListObjectsCallback cb, bool delimiters, int maxKeys,
404404 std::string* marker);
@@ -527,17 +527,17 @@ int OssClient::walk_list_results(const SimpleDOM::Node& list_bucket_result,
527527 return 0 ;
528528}
529529
530- int OssClient::do_list_objects_v2 (std::string_view bucket,
531- std::string_view prefix,
532- ListObjectsCallback cb, bool delimiters,
533- int maxKeys, std::string* marker) {
530+ int OssClient::do_list_objects_v2 (std::string_view bucket, std::string_view prefix,
531+ ListObjectsCallback cb, bool delimiters, int maxKeys,
532+ std::string* marker, std::string_view start_after) {
534533 if (maxKeys > 1000 || maxKeys <= 0 ) maxKeys = m_oss_options.max_list_ret_cnt ;
535534 estring_view _mark;
536535 if (marker) _mark = *marker;
537536
538537 estring escaped_prefix = photon::net::http::url_escape (prefix);
539538 estring escaped_delimiter = photon::net::http::url_escape (" /" );
540539 estring escaped_marker = photon::net::http::url_escape (_mark);
540+ estring escaped_start_after = photon::net::http::url_escape (start_after);
541541 estring max_key_str = std::to_string (maxKeys);
542542 // must appear in dictionary order!
543543 DEFINE_APPENDABLE_ORDERED_STRING_KV (
@@ -552,7 +552,8 @@ int OssClient::do_list_objects_v2(std::string_view bucket,
552552 query_params.insert ({OSS_PARAM_KEY_DELIMITER, escaped_delimiter});
553553 if (!_mark.empty ())
554554 query_params.insert ({OSS_PARAM_KEY_CONTINUATION_TOKEN, escaped_marker});
555-
555+ if (!start_after.empty ())
556+ query_params.insert ({OSS_PARAM_KEY_START_AFTER, escaped_start_after});
556557 OssUrl oss_url (m_endpoint, bucket, {}, m_is_http);
557558 DEFINE_ONSTACK_OP (m_client, Verb::GET, oss_url.append_params (query_params));
558559 int r = sign_and_call (op, Verb::GET, oss_url, query_params);
@@ -790,7 +791,7 @@ int OssClient::list_objects(std::string_view prefix, ListObjectsCallback cb,
790791 do {
791792 if (params.ver == 2 ) {
792793 r = do_list_objects_v2 (m_bucket, prefix, cb, params.slash_delimiter ,
793- max_keys, &marker);
794+ max_keys, &marker, params. start_after );
794795 } else {
795796 r = do_list_objects_v1 (m_bucket, prefix, cb, params.slash_delimiter ,
796797 max_keys, &marker);
@@ -1190,7 +1191,7 @@ int OssClient::batch_get_objects(std::vector<GetObjectParameters>& params) {
11901191 remaining -= cur;
11911192 if (remaining == 0 ) break ;
11921193 }
1193-
1194+
11941195 r = frame.read_data (stream, &iovs[0 ], iovs.size ());
11951196 } else {
11961197 r = frame.read_data (stream, param.iov , param.iovcnt );
0 commit comments