You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by gi...@apache.org on 2023/03/16 10:07:50 UTC

[incubator-opendal] branch gh-pages updated: deploy: 0891be8ce6f0d0ea41d24f9aa1987c1e98f6a670

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new eaca1a3a deploy: 0891be8ce6f0d0ea41d24f9aa1987c1e98f6a670
eaca1a3a is described below

commit eaca1a3ac07d63aaeba47df14db39ded87e0a105
Author: Xuanwo <Xu...@users.noreply.github.com>
AuthorDate: Thu Mar 16 10:07:45 2023 +0000

    deploy: 0891be8ce6f0d0ea41d24f9aa1987c1e98f6a670
---
 404.html                                           |   4 +-
 .../{1db64337.4d70bc73.js => 1db64337.0d3e2d04.js} |   2 +-
 ...e~main.1898480d.js => runtime~main.c94552c1.js} |   2 +-
 docs/overview/index.html                           |   6 +-
 docs/rust/opendal/services/struct.Azblob.html      |  20 +-
 docs/rust/opendal/struct.Operator.html             |  56 +-
 docs/rust/opendal/struct.Reader.html               |  10 +-
 docs/rust/opendal/trait.Builder.html               |   2 +-
 docs/rust/source-files.js                          |   2 +-
 .../src/opendal/services/azblob/backend.rs.html    | 226 +++++++-
 .../rust/src/opendal/services/azblob/batch.rs.html | 628 +++++++++++++++++++++
 .../rust/src/opendal/services/azblob/error.rs.html |  44 ++
 docs/rust/src/opendal/services/azblob/mod.rs.html  |   2 +
 .../src/opendal/types/operator/operator.rs.html    |   8 +-
 index.html                                         |   4 +-
 15 files changed, 954 insertions(+), 62 deletions(-)

diff --git a/404.html b/404.html
index 4dafa657..cffa7080 100644
--- a/404.html
+++ b/404.html
@@ -4,13 +4,13 @@
 <meta charset="UTF-8">
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Page Not Found | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/404.html"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh [...]
-<link rel="preload" href="/assets/js/runtime~main.1898480d.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.c94552c1.js" as="script">
 <link rel="preload" href="/assets/js/main.2400006f.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="roun [...]
-<script src="/assets/js/runtime~main.1898480d.js"></script>
+<script src="/assets/js/runtime~main.c94552c1.js"></script>
 <script src="/assets/js/main.2400006f.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/1db64337.4d70bc73.js b/assets/js/1db64337.0d3e2d04.js
similarity index 67%
rename from assets/js/1db64337.4d70bc73.js
rename to assets/js/1db64337.0d3e2d04.js
index 90b7a167..b98dc4fc 100644
--- a/assets/js/1db64337.4d70bc73.js
+++ b/assets/js/1db64337.0d3e2d04.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[372],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>v});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
+"use strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[372],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>v});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}retur [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.1898480d.js b/assets/js/runtime~main.c94552c1.js
similarity index 80%
rename from assets/js/runtime~main.1898480d.js
rename to assets/js/runtime~main.c94552c1.js
index d2a93624..8ddb80c6 100644
--- a/assets/js/runtime~main.1898480d.js
+++ b/assets/js/runtime~main.c94552c1.js
@@ -1 +1 @@
-(()=>{"use strict";var e,t,r,o,n,a={},i={};function f(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={exports:{}};return a[e].call(r.exports,r,r.exports,f),r.exports}f.m=a,e=[],f.O=(t,r,o,n)=>{if(!r){var a=1/0;for(c=0;c<e.length;c++){r=e[c][0],o=e[c][1],n=e[c][2];for(var i=!0,u=0;u<r.length;u++)(!1&n||a>=n)&&Object.keys(f.O).every((e=>f.O[e](r[u])))?r.splice(u--,1):(i=!1,n<a&&(a=n));if(i){e.splice(c--,1);var l=o();void 0!==l&&(t=l)}}return t}n=n||0;for(var c=e.length;c>0&&e[c-1] [...]
\ No newline at end of file
+(()=>{"use strict";var e,t,r,o,n,a={},i={};function f(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={exports:{}};return a[e].call(r.exports,r,r.exports,f),r.exports}f.m=a,e=[],f.O=(t,r,o,n)=>{if(!r){var a=1/0;for(d=0;d<e.length;d++){r=e[d][0],o=e[d][1],n=e[d][2];for(var i=!0,u=0;u<r.length;u++)(!1&n||a>=n)&&Object.keys(f.O).every((e=>f.O[e](r[u])))?r.splice(u--,1):(i=!1,n<a&&(a=n));if(i){e.splice(d--,1);var l=o();void 0!==l&&(t=l)}}return t}n=n||0;for(var d=e.length;d>0&&e[d-1] [...]
\ No newline at end of file
diff --git a/docs/overview/index.html b/docs/overview/index.html
index 44814235..7eb8c32c 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -4,13 +4,13 @@
 <meta charset="UTF-8">
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Overview | Apache OpenDAL</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/docs/overview"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data [...]
-<link rel="preload" href="/assets/js/runtime~main.1898480d.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.c94552c1.js" as="script">
 <link rel="preload" href="/assets/js/main.2400006f.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
-<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="roun [...]
-<script src="/assets/js/runtime~main.1898480d.js"></script>
+<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="roun [...]
+<script src="/assets/js/runtime~main.c94552c1.js"></script>
 <script src="/assets/js/main.2400006f.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/rust/opendal/services/struct.Azblob.html b/docs/rust/opendal/services/struct.Azblob.html
index 5459aa07..c59b121d 100644
--- a/docs/rust/opendal/services/struct.Azblob.html
+++ b/docs/rust/opendal/services/struct.Azblob.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Azure Storage Blob services support."><meta name="keywords" content="rust, rustlang, rust-lang, Azblob"><title>Azblob in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2">< [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Azure Storage Blob services support."><meta name="keywords" content="rust, rustlang, rust-lang, Azblob"><title>Azblob in opendal::services - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2">< [...]
 <h2 id="capabilities"><a href="#capabilities">Capabilities</a></h2>
 <p>This service can be used to:</p>
 <ul>
@@ -64,37 +64,37 @@ az storage container create --name test --connection-string &quot;DefaultEndpoin
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#162-329">source</a><a href="#impl-AzblobBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="s [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#168-335">source</a><a href="#impl-AzblobBuilder" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="s [...]
 <p>All operations will happen under this root.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.container" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#175-179">source</a><h4 class="code-header">pub fn <a href="#method.container" class="fn">container</a>(&amp;mut self, container: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#187-194">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.container" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#181-185">source</a><h4 class="code-header">pub fn <a href="#method.container" class="fn">container</a>(&amp;mut self, container: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.endpoint" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#193-200">source</a><h4 class="code-header">pub fn <a href="#method.endpoint" class="fn">endpoint</a>(&amp;mut self, endpoint: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org [...]
 <p>Endpoint must be full uri, e.g.</p>
 <ul>
 <li>Azblob: <code>https://accountname.blob.core.windows.net</code></li>
 <li>Azurite: <code>http://127.0.0.1:10000/devstoreaccount1</code></li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.account_name" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#200-206">source</a><h4 class="code-header">pub fn <a href="#method.account_name" class="fn">account_name</a>(&amp;mut self, account_name: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://d [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.account_name" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#206-212">source</a><h4 class="code-header">pub fn <a href="#method.account_name" class="fn">account_name</a>(&amp;mut self, account_name: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://d [...]
 <ul>
 <li>If account_name is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.account_key" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#212-218">source</a><h4 class="code-header">pub fn <a href="#method.account_key" class="fn">account_key</a>(&amp;mut self, account_key: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.r [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.account_key" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#218-224">source</a><h4 class="code-header">pub fn <a href="#method.account_key" class="fn">account_key</a>(&amp;mut self, account_key: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.r [...]
 <ul>
 <li>If account_key is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.sas_token" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#227-233">source</a><h4 class="code-header">pub fn <a href="#method.sas_token" class="fn">sas_token</a>(&amp;mut self, sas_token: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.sas_token" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#233-239">source</a><h4 class="code-header">pub fn <a href="#method.sas_token" class="fn">sas_token</a>(&amp;mut self, sas_token: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="primitive" href="https://doc.rust-lang [...]
 <ul>
 <li>If sas_token is set, we will take user’s input first.</li>
 <li>If not, we will try to load it from environment.</li>
 </ul>
 <p>See <a href="https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview">Grant limited access to Azure Storage resources using shared access signatures (SAS)</a>
 for more info.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#241-244">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.http_client" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#247-250">source</a><h4 class="code-header">pub fn <a href="#method.http_client" class="fn">http_client</a>(&amp;mut self, client: <a class="struct" href="../raw/struct.HttpClient.html" title="struct opendal::raw::HttpClient">HttpClient</a>) -&gt; <a class="primitive" href="https [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>This API is part of OpenDAL’s Raw API. <code>HttpClient</code> could be changed
 during minor updates.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.from_connection_string" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#273-328">source</a><h4 class="code-header">pub fn <a href="#method.from_connection_string" class="fn">from_connection_string</a>(conn: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="../type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.from_connection_string" class="method has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#279-334">source</a><h4 class="code-header">pub fn <a href="#method.from_connection_string" class="fn">from_connection_string</a>(conn: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="../type [...]
 <p>connection string looks like:</p>
 <div class="example-wrap"><pre class="language-txt"><code>DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
 AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
@@ -112,7 +112,7 @@ EndpointSuffix=core.chinacloudapi.cn;
 <h5 id="note"><a href="#note">Note</a></h5>
 <p>connection string only configures the endpoint, account name and account key.
 User still needs to configure bucket names.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#331-419">source</a><a href="#impl-Builder-for-AzblobBuilder" clas [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Builder-for-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="../../src/opendal/services/azblob/backend.rs.html#337-435">source</a><a href="#impl-Builder-for-AzblobBuilder" clas [...]
 </div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Instrument-for-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#276">source</a><a href="#impl-Instrument-for-AzblobBuilder" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html" title="trait tracing::i [...]
 <code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.instrument">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.in_current_span" class="method trait-impl has-srclink"><a class="srclink rightside" href="https://docs.rs/tracing/0.1.37/src/tracing/instrument.rs.html#121">source</a><a href="#method.in_current_span" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
 <code>Instrumented</code> wrapper. <a href="https://docs.rs/tracing/0.1.37/tracing/instrument/trait.Instrument.html#method.in_current_span">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-AzblobBuilder" class="impl has-srclink"><a class="srclink rightside" href="https://doc.rust-lang.org/1.68.0/src/core/convert/mod.rs.html#717">source</a><a href="#impl-Into%3CU%3E-for-AzblobBuilder" class="anchor">§</a><h [...]
diff --git a/docs/rust/opendal/struct.Operator.html b/docs/rust/opendal/struct.Operator.html
index 85aa5aa9..1f344325 100644
--- a/docs/rust/opendal/struct.Operator.html
+++ b/docs/rust/opendal/struct.Operator.html
@@ -19,24 +19,24 @@
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#70-125">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#94-98">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Speci [...]
+</div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Operator" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#70-123">source</a><a href="#impl-Operator" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_limit" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#92-96">source</a><h4 class="code-header">pub fn <a href="#method.with_limit" class="fn">with_limit</a>(&amp;self, limit: <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Speci [...]
 <p>Default: 1000</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#115-117">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underly [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.info" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#113-115">source</a><h4 class="code-header">pub fn <a href="#method.info" class="fn">info</a>(&amp;self) -&gt; <a class="struct" href="struct.OperatorInfo.html" title="struct opendal::OperatorInfo">OperatorInfo</a></h4></section></summary><div class="docblock"><p>Get information of underly [...]
 <h5 id="examples-1"><a href="#examples-1">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 <span class="kw">let </span>info = op.info();</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#122-124">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Cr [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.blocking" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#120-122">source</a><h4 class="code-header">pub fn <a href="#method.blocking" class="fn">blocking</a>(&amp;self) -&gt; <a class="struct" href="struct.BlockingOperator.html" title="struct opendal::BlockingOperator">BlockingOperator</a></h4></section></summary><div class="docblock"><p>Cr [...]
 <p>This operation is nearly no cost.</p>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#128-886">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator async API.</p>
-</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.check" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#144-151">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-1" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#126-884">source</a><a href="#impl-Operator-1" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator async API.</p>
+</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.check" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#142-149">source</a><h4 class="code-header">pub async fn <a href="#method.check" class="fn">check</a>(&amp;self) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result">Result</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive [...]
 <p>We will send a <code>list</code> request to path and return any errors we met.</p>
 
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>opendal::Operator;
 
 op.check().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#184-191">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.stat" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#182-189">source</a><h4 class="code-header">pub async fn <a href="#method.stat" class="fn">stat</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
 <h5 id="notes"><a href="#notes">Notes</a></h5>
 <p>Use <code>stat</code> if you:</p>
 <ul>
@@ -53,7 +53,7 @@ you want has already been cached.</p>
         <span class="macro">println!</span>(<span class="string">&quot;file not exist&quot;</span>)
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.metadata" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#277-292">source</a><h4 class="code-header">pub async fn <a href="#method.metadata" class="fn">metadata</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;entry: &amp;<a class="struct" href="struct.Entry.html" title="struct opendal::Entry">Entry</a>,<br>&nbsp;&nbsp;& [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.metadata" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#275-290">source</a><h4 class="code-header">pub async fn <a href="#method.metadata" class="fn">metadata</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;entry: &amp;<a class="struct" href="struct.Entry.html" title="struct opendal::Entry">Entry</a>,<br>&nbsp;&nbsp;& [...]
 <p><code>metadata</code> will check the given query with already cached metadata
 first. And query from storage if not found.</p>
 <h5 id="notes-1"><a href="#notes-1">Notes</a></h5>
@@ -100,7 +100,7 @@ cache. In this way, we can make sure that no API call will send.</p>
 </span><span class="kw">let _ </span>= meta.content_length();
 <span class="comment">// etag MUST be correct.
 </span><span class="kw">let _ </span>= meta.etag();</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#310-319">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opend [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_exist" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#308-317">source</a><h4 class="code-header">pub async fn <a href="#method.is_exist" class="fn">is_exist</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opend [...]
 <h5 id="example"><a href="#example">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -112,7 +112,7 @@ cache. In this way, we can make sure that no API call will send.</p>
 
     <span class="prelude-val">Ok</span>(())
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#346-363">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.create_dir" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#344-361">source</a><h4 class="code-header">pub async fn <a href="#method.create_dir" class="fn">create_dir</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type [...]
 <h5 id="notes-2"><a href="#notes-2">Notes</a></h5>
 <p>To indicate that a path is a directory, it is compulsory to include
 a trailing / in the path. Failure to do so may result in
@@ -124,12 +124,12 @@ a trailing / in the path. Failure to do so may result in
 </ul>
 <h5 id="examples-4"><a href="#examples-4">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.create_dir(<span class="string">&quot;path/to/dir/&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#382-384">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#380-382">source</a><h4 class="code-header">pub async fn <a href="#method.read" class="fn">read</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
 <p>This function will allocate a new bytes internally. For more precise memory control or
 reading data lazily, please use <a href="struct.Operator.html#method.reader" title="Operator::reader"><code>Operator::reader</code></a></p>
 <h5 id="examples-5"><a href="#examples-5">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>bs = op.read(<span class="string">&quot;path/to/file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.range_read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#407-448">source</a><h4 class="code-header">pub async fn <a href="#method.range_read" class="fn">range_read</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.range_read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#405-446">source</a><h4 class="code-header">pub async fn <a href="#method.range_read" class="fn">range_read</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
 <p>This function will allocate a new bytes internally. For more precise memory control or
 reading data lazily, please use <a href="struct.Operator.html#method.range_reader" title="Operator::range_reader"><code>Operator::range_reader</code></a></p>
 <h5 id="notes-3"><a href="#notes-3">Notes</a></h5>
@@ -138,17 +138,17 @@ reading data lazily, please use <a href="struct.Operator.html#method.range_reade
 </ul>
 <h5 id="examples-6"><a href="#examples-6">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>bs = op.range_read(<span class="string">&quot;path/to/file&quot;</span>, <span class="number">1024</span>..<span class="number">2048</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.reader" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#465-467">source</a><h4 class="code-header">pub async fn <a href="#method.reader" class="fn">reader</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.reader" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#463-465">source</a><h4 class="code-header">pub async fn <a href="#method.reader" class="fn">reader</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
 <h5 id="examples-7"><a href="#examples-7">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>r = op.reader(<span class="string">&quot;path/to/file&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.range_reader" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#487-502">source</a><h4 class="code-header">pub async fn <a href="#method.range_reader" class="fn">range_reader</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.range_reader" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#485-500">source</a><h4 class="code-header">pub async fn <a href="#method.range_reader" class="fn">range_reader</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</ [...]
 <h5 id="notes-4"><a href="#notes-4">Notes</a></h5>
 <ul>
 <li>The returning content’s length may be smaller than the range specified.</li>
 </ul>
 <h5 id="examples-8"><a href="#examples-8">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">let </span>r = op.range_reader(<span class="string">&quot;path/to/file&quot;</span>, <span class="number">1024</span>..<span class="number">2048</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#525-527">source</a><h4 class="code-header">pub async fn <a href="#method.write" class="fn">write</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/co [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#523-525">source</a><h4 class="code-header">pub async fn <a href="#method.write" class="fn">write</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>, bs: impl <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/co [...]
 <h5 id="notes-5"><a href="#notes-5">Notes</a></h5>
 <ul>
 <li>Write will make sure all bytes has been written, or an error will be returned.</li>
@@ -157,7 +157,7 @@ reading data lazily, please use <a href="struct.Operator.html#method.range_reade
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>bytes::Bytes;
 
 op.write(<span class="string">&quot;path/to/file&quot;</span>, <span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.writer" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#553-567">source</a><h4 class="code-header">pub async fn <a href="#method.writer" class="fn">writer</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.writer" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#551-565">source</a><h4 class="code-header">pub async fn <a href="#method.writer" class="fn">writer</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
 <h5 id="notes-6"><a href="#notes-6">Notes</a></h5>
 <ul>
 <li>Write will make sure all bytes has been written, or an error will be returned.</li>
@@ -169,7 +169,7 @@ op.write(<span class="string">&quot;path/to/file&quot;</span>, <span class="macr
 w.append(<span class="macro">vec!</span>[<span class="number">0</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.append(<span class="macro">vec!</span>[<span class="number">1</span>; <span class="number">4096</span>]).<span class="kw">await</span><span class="question-mark">?</span>;
 w.close().<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.write_with" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#591-608">source</a><h4 class="code-header">pub async fn <a href="#method.write_with" class="fn">write_with</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.write_with" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#589-606">source</a><h4 class="code-header">pub async fn <a href="#method.write_with" class="fn">write_with</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
 <h5 id="notes-7"><a href="#notes-7">Notes</a></h5>
 <ul>
 <li>Write will make sure all bytes has been written, or an error will be returned.</li>
@@ -181,20 +181,20 @@ w.close().<span class="kw">await</span><span class="question-mark">?</span>;</co
 <span class="kw">let </span>bs = <span class="string">b&quot;hello, world!&quot;</span>.to_vec();
 <span class="kw">let </span>args = OpWrite::new().with_content_type(<span class="string">&quot;text/plain&quot;</span>);
 <span class="kw">let _ </span>= op.write_with(<span class="string">&quot;path/to/file&quot;</span>, args, bs).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.delete" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#628-634">source</a><h4 class="code-header">pub async fn <a href="#method.delete" class="fn">delete</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.delete" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#626-632">source</a><h4 class="code-header">pub async fn <a href="#method.delete" class="fn">delete</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Re [...]
 <h5 id="notes-8"><a href="#notes-8">Notes</a></h5>
 <ul>
 <li>Delete not existing error won’t return errors.</li>
 </ul>
 <h5 id="examples-12"><a href="#examples-12">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.delete(<span class="string">&quot;test&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#656-658">source</a><h4 class="code-header">pub async fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#654-656">source</a><h4 class="code-header">pub async fn <a href="#method.remove" class="fn">remove</a>(&amp;self, paths: <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="struct" href="https://doc.rust [...]
 <p>If underlying services support delete in batch, we will use batch
 delete instead.</p>
 <h5 id="examples-13"><a href="#examples-13">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove(<span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()])
     .<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#686-714">source</a><h4 class="code-header">pub async fn <a href="#method.remove_via" class="fn">remove_via</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;input: impl Stream&lt;Item = <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/string/struct. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_via" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#684-712">source</a><h4 class="code-header">pub async fn <a href="#method.remove_via" class="fn">remove_via</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;input: impl Stream&lt;Item = <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/string/struct. [...]
 remove_via will remove files via given stream.</p>
 <p>We will delete by chunks with given batch limit on the stream.</p>
 <h5 id="notes-10"><a href="#notes-10">Notes</a></h5>
@@ -204,13 +204,13 @@ delete instead.</p>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>futures::stream;
 <span class="kw">let </span>stream = stream::iter(<span class="macro">vec!</span>[<span class="string">&quot;abc&quot;</span>.to_string(), <span class="string">&quot;def&quot;</span>.to_string()]);
 op.remove_via(stream).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#736-782">source</a><h4 class="code-header">pub async fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.remove_all" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#734-780">source</a><h4 class="code-header">pub async fn <a href="#method.remove_all" class="fn">remove_all</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type [...]
 <h5 id="notes-11"><a href="#notes-11">Notes</a></h5>
 <p>If underlying services support delete in batch, we will use batch
 delete instead.</p>
 <h5 id="examples-15"><a href="#examples-15">Examples</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code>op.remove_all(<span class="string">&quot;path/to/dir&quot;</span>).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#817-833">source</a><h4 class="code-header">pub async fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.list" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#815-831">source</a><h4 class="code-header">pub async fn <a href="#method.list" class="fn">list</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
 <p>This function will create a new handle to list entries.</p>
 <p>An error will be returned if given path doesn’t end with <code>/</code>.</p>
 <h5 id="examples-16"><a href="#examples-16">Examples</a></h5>
@@ -228,7 +228,7 @@ delete instead.</p>
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.scan" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#869-885">source</a><h4 class="code-header">pub async fn <a href="#method.scan" class="fn">scan</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.scan" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#867-883">source</a><h4 class="code-header">pub async fn <a href="#method.scan" class="fn">scan</a>(&amp;self, path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>) -&gt; <a class="type" href="type.Result.html" title="type opendal::Result"> [...]
 <p>This function will create a new handle to list entries.</p>
 <p>An error will be returned if given path doesn’t end with <code>/</code>.</p>
 <h5 id="examples-17"><a href="#examples-17">Examples</a></h5>
@@ -246,8 +246,8 @@ delete instead.</p>
         EntryMode::Unknown =&gt; <span class="kw">continue</span>,
     }
 }</code></pre></div>
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-2" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#889-1023">source</a><a href="#impl-Operator-2" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator presign API.</p>
-</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.presign_stat" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#911-918">source</a><h4 class="code-header">pub fn <a href="#method.presign_stat" class="fn">presign_stat</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.htm [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Operator-2" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#887-1021">source</a><a href="#impl-Operator-2" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Operator.html" title="struct opendal::Operator">Operator</a></h3></section></summary><div class="docblock"><p>Operator presign API.</p>
+</div><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.presign_stat" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#909-916">source</a><h4 class="code-header">pub fn <a href="#method.presign_stat" class="fn">presign_stat</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.htm [...]
 <h5 id="example-1"><a href="#example-1">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -262,7 +262,7 @@ delete instead.</p>
         .uri(signed_req.uri())
         .body(())<span class="question-mark">?</span>;
 </code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#946-953">source</a><h4 class="code-header">pub fn <a href="#method.presign_read" class="fn">presign_read</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.presign_read" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#944-951">source</a><h4 class="code-header">pub fn <a href="#method.presign_read" class="fn">presign_read</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.str.html">str</a>,<br [...]
 <h5 id="example-2"><a href="#example-2">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -279,7 +279,7 @@ delete instead.</p>
 </ul>
 <p>We can download this file via <code>curl</code> or other tools without credentials:</p>
 <div class="example-wrap"><pre class="language-shell"><code>curl &quot;https://s3.amazonaws.com/examplebucket/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=access_key_id/20130721/us-east-1/s3/aws4_request&amp;X-Amz-Date=20130721T201207Z&amp;X-Amz-Expires=86400&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=&lt;signature-value&gt;&quot; -O /tmp/test.txt
-</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#981-983">source</a><h4 class="code-header">pub fn <a href="#method.presign_write" class="fn">presign_write</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive [...]
+</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#979-981">source</a><h4 class="code-header">pub fn <a href="#method.presign_write" class="fn">presign_write</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive [...]
 <h5 id="example-3"><a href="#example-3">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
 <span class="kw">use </span>futures::io;
@@ -296,7 +296,7 @@ delete instead.</p>
 </ul>
 <p>We can upload file as this file via <code>curl</code> or other tools without credential:</p>
 <div class="example-wrap"><pre class="language-shell"><code>curl -X PUT &quot;https://s3.amazonaws.com/examplebucket/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=access_key_id/20130721/us-east-1/s3/aws4_request&amp;X-Amz-Date=20130721T201207Z&amp;X-Amz-Expires=86400&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=&lt;signature-value&gt;&quot; -d &quot;Hello, World!&quot;
-</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write_with" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1010-1022">source</a><h4 class="code-header">pub fn <a href="#method.presign_write_with" class="fn">presign_write_with</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.6 [...]
+</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.presign_write_with" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/operator/operator.rs.html#1008-1020">source</a><h4 class="code-header">pub fn <a href="#method.presign_write_with" class="fn">presign_write_with</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;path: &amp;<a class="primitive" href="https://doc.rust-lang.org/1.6 [...]
 <p>You can pass <code>OpWrite</code> to this method to specify the content length and content type.</p>
 <h5 id="example-4"><a href="#example-4">Example</a></h5>
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>anyhow::Result;
diff --git a/docs/rust/opendal/struct.Reader.html b/docs/rust/opendal/struct.Reader.html
index 3e460b65..99efaced 100644
--- a/docs/rust/opendal/struct.Reader.html
+++ b/docs/rust/opendal/struct.Reader.html
@@ -20,10 +20,10 @@ stream based (like services s3, azure which based on HTTP).</p>
 </div></details><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncRead-for-Reader" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/reader.rs.html#94-102">source</a><a href="#impl-AsyncRead-for-Reader" class="anchor">§</a><h3 class="code-header">impl As [...]
 IO operations. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-AsyncRead-for-Reader-1" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/reader.rs.html#114-128">source</a><a href="#impl-AsyncRead-for-Reader-1" class="anchor">§</a><h3 class="code-header">impl AsyncRead for <a class="struct" href="struct.Reader.html" title="struct opendal::Reader">Reader</a></h3></section></summary><d [...]
 current task for wakeup if the value is not yet available, and returning
-<code>None</code> if the stream is exhausted. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.size_hint" class="method trait-impl has-srclink"><a href="#method.size_hint" class="anchor">§</a><h4 class="code-header">fn <a class="fn">size_hint</a>(&amp;self) -&gt; (<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.68.0/core/option/enum.Opt [...]
+<code>None</code> if the stream is exhausted. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.size_hint" class="method trait-impl has-srclink"><a href="#method.size_hint" class="anchor">§</a><h4 class="code-header">fn <a class="fn">size_hint</a>(&amp;self) -&gt; (<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>, <a class="enum" href="https://doc.rust-lang.org/1.68.0/core/option/enum.Opt [...]
 manner, returning a future type. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_vectored" class="method trait-impl has-srclink"><a href="#method.read_vectored" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_vectored</a>&lt;'a&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;'a mut self,<br>&nbsp;&nbsp;&nbsp;&nbsp;bufs: &amp;'a mut [<a class="struct" href="https://doc.rust-lang.org/1.68.0/std/io/struct.IoSliceMut.html" t [...]
 IO operations. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_exact" class="method trait-impl has-srclink"><a href="#method.read_exact" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_exact</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.u8.html">u8</a>]) -&gt; ReadExact&lt;'a, Self&gt;<span class="where fmt-newline">where<br>&nbsp;&n [...]
-returning an error if end of file (EOF) is hit sooner. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method trait-impl has-srclink"><a href="#method.read_to_end" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_to_end</a>&lt;'a&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;'a mut self,<br>&nbsp;&nbsp;&nbsp;&nbsp;buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/vec/struct.V [...]
+returning an error if end of file (EOF) is hit sooner. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_to_end" class="method trait-impl has-srclink"><a href="#method.read_to_end" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_to_end</a>&lt;'a&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;'a mut self,<br>&nbsp;&nbsp;&nbsp;&nbsp;buf: &amp;'a mut <a class="struct" href="https://doc.rust-lang.org/1.68.0/alloc/vec/struct.V [...]
 from the underlying reader. <a>Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-AsyncReadExt-for-Reader-1" class="impl has-srclink"><a href="#impl-AsyncReadExt-for-Reader-1" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; AsyncReadExt for R<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: AsyncRead + ?<a class="trait" href="https://doc.rust-lang.org/1.68.0/core/marker/trait.Sized.html" title="t [...]
 <code>next</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read-1" class="method trait-impl has-srclink"><a href="#method.read-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read</a>&lt;'a&gt;(&amp;'a mut self, buf: &amp;'a mut [<a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.u8.html">u8</a>]) -&gt; Read&lt;'a, Self&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp [...]
 returning how many bytes were read. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.read_buf" class="method trait-impl has-srclink"><a href="#method.read_buf" class="anchor">§</a><h4 class="code-header">fn <a class="fn">read_buf</a>&lt;B, 'a&gt;(&amp;'a mut self, buf: <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.reference.html">&amp;'a mut </a>B) -&gt; ReadBuf&lt;'a, Self, B&gt;<span class="where fmt-new [...]
@@ -77,10 +77,10 @@ resolves to <code>true</code>. <a>Read more</a></div></details><details class="t
 resolves to <code>true</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take_until" class="method trait-impl has-srclink"><a href="#method.take_until" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take_until</a>&lt;Fut&gt;(self, fut: Fut) -&gt; TakeUntil&lt;Self, Fut&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Fut: <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/future/futur [...]
 closure for each element on the stream. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.for_each_concurrent" class="method trait-impl has-srclink"><a href="#method.for_each_concurrent" class="anchor">§</a><h4 class="code-header">fn <a class="fn">for_each_concurrent</a>&lt;Fut, F&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;self,<br>&nbsp;&nbsp;&nbsp;&nbsp;limit: impl <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/convert/trait.Into [...]
 closure for each element on the stream concurrently as elements become
-available. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take-1" class="method trait-impl has-srclink"><a href="#method.take-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a>(self, n: <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>) -&gt; Take&lt;Self&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href="https://doc.ru [...]
+available. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.take" class="method trait-impl has-srclink"><a href="#method.take" class="anchor">§</a><h4 class="code-header">fn <a class="fn">take</a>(self, n: <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.usize.html">usize</a>) -&gt; Take&lt;Self&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href="https://doc.rust-l [...]
 again be called once it has finished. This method can be used to turn
-any <code>Stream</code> into a <code>FusedStream</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.by_ref" class="method trait-impl has-srclink"><a href="#method.by_ref" class="anchor">§</a><h4 class="code-header">fn <a class="fn">by_ref</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.reference.html">&amp;mut </a>Self</h4></section></summary><div class='docblock'>Borrows a str [...]
-into the sink and the sink has been flushed and closed. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.split-1" class="method trait-impl has-srclink"><a href="#method.split-1" class="anchor">§</a><h4 class="code-header">fn <a class="fn">split</a>&lt;Item&gt;(self) -&gt; (SplitSink&lt;Self, Item&gt;, SplitStream&lt;Self&gt;)<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: Sink&lt;Item&gt; + <a class="trait" hre [...]
+any <code>Stream</code> into a <code>FusedStream</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.by_ref" class="method trait-impl has-srclink"><a href="#method.by_ref" class="anchor">§</a><h4 class="code-header">fn <a class="fn">by_ref</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.68.0/std/primitive.reference.html">&amp;mut </a>Self</h4></section></summary><div class='docblock'>Borrows a str [...]
+into the sink and the sink has been flushed and closed. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.split" class="method trait-impl has-srclink"><a href="#method.split" class="anchor">§</a><h4 class="code-header">fn <a class="fn">split</a>&lt;Item&gt;(self) -&gt; (SplitSink&lt;Self, Item&gt;, SplitStream&lt;Self&gt;)<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: Sink&lt;Item&gt; + <a class="trait" href="h [...]
 objects. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.inspect" class="method trait-impl has-srclink"><a href="#method.inspect" class="anchor">§</a><h4 class="code-header">fn <a class="fn">inspect</a>&lt;F&gt;(self, f: F) -&gt; Inspect&lt;Self, F&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/ops/function/trait.FnMut.html" title="trait core::ops:: [...]
 of that <code>Either</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.right_stream" class="method trait-impl has-srclink"><a href="#method.right_stream" class="anchor">§</a><h4 class="code-header">fn <a class="fn">right_stream</a>&lt;B&gt;(self) -&gt; Either&lt;B, Self&gt;<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;B: Stream&lt;Item = Self::Item&gt;,<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href= [...]
 of that <code>Either</code>. <a>Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.poll_next_unpin" class="method trait-impl has-srclink"><a href="#method.poll_next_unpin" class="anchor">§</a><h4 class="code-header">fn <a class="fn">poll_next_unpin</a>(&amp;mut self, cx: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.68.0/core/task/wake/struct.Context.html" title="struct core::task::wake::Context">Context</a>&lt;'_&gt;) -&gt [...]
diff --git a/docs/rust/opendal/trait.Builder.html b/docs/rust/opendal/trait.Builder.html
index e3c7def5..8ef07a92 100644
--- a/docs/rust/opendal/trait.Builder.html
+++ b/docs/rust/opendal/trait.Builder.html
@@ -19,4 +19,4 @@
 </div></details></div><h2 id="provided-methods" class="small-section-header">Provided Methods<a href="#provided-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="method.from_iter" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#37-42">source</a><h4 class="code-header">fn <a href="#method.from_iter" class="fn">from_iter</a>(iter: impl <a class="trait" href="https://doc. [...]
 </div></details><details class="toggle method-toggle" open><summary><section id="method.from_env" class="method has-srclink"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#45-59">source</a><h4 class="code-header">fn <a href="#method.from_env" class="fn">from_env</a>() -&gt; Self<span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;Self: <a class="trait" href="https://doc.rust-lang.org/1.68.0/core/marker/trait.Sized.html" title="trait core::marker::Size [...]
 </div></details></div><h2 id="foreign-impls" class="small-section-header">Implementations on Foreign Types<a href="#foreign-impls" class="anchor">§</a></h2><details class="toggle implementors-toggle"><summary><section id="impl-Builder-for-()" class="impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#66-76">source</a><a href="#impl-Builder-for-()" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.Builder.html" title="trait [...]
-</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#67">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Acc [...]
\ No newline at end of file
+</div><div class="impl-items"><section id="associatedconstant.SCHEME-1" class="associatedconstant trait-impl has-srclink"><a class="srclink rightside" href="../src/opendal/types/builder.rs.html#67">source</a><a href="#associatedconstant.SCHEME-1" class="anchor">§</a><h4 class="code-header">const <a href="#associatedconstant.SCHEME" class="constant">SCHEME</a>: <a class="enum" href="enum.Scheme.html" title="enum opendal::Scheme">Scheme</a> = _</h4></section><section id="associatedtype.Acc [...]
\ No newline at end of file
diff --git a/docs/rust/source-files.js b/docs/rust/source-files.js
index 51dded4b..39832a4d 100644
--- a/docs/rust/source-files.js
+++ b/docs/rust/source-files.js
@@ -1,4 +1,4 @@
 var sourcesIndex = JSON.parse('{\
-"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","metrics.rs","mod.rs","retry.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters",[["kv",[],["api.rs","backend.rs","mod.rs"]]],["mod.rs"]],["http_util",[],["body.rs","bytes_content_range.rs","bytes_range.rs","client.rs [...]
+"opendal":["",[["docs",[["comparisons",[],["mod.rs"]],["internals",[],["accessor.rs","layer.rs","mod.rs"]],["rfcs",[],["mod.rs"]]],["concepts.rs","mod.rs"]],["layers",[],["chaos.rs","complete.rs","concurrent_limit.rs","error_context.rs","immutable_index.rs","logging.rs","metrics.rs","mod.rs","retry.rs","tracing.rs","type_eraser.rs"]],["raw",[["adapters",[["kv",[],["api.rs","backend.rs","mod.rs"]]],["mod.rs"]],["http_util",[],["body.rs","bytes_content_range.rs","bytes_range.rs","client.rs [...]
 }');
 createSourceSidebar();
diff --git a/docs/rust/src/opendal/services/azblob/backend.rs.html b/docs/rust/src/opendal/services/azblob/backend.rs.html
index f2da994d..7c049145 100644
--- a/docs/rust/src/opendal/services/azblob/backend.rs.html
+++ b/docs/rust/src/opendal/services/azblob/backend.rs.html
@@ -905,6 +905,117 @@
 <a href="#905" id="905">905</a>
 <a href="#906" id="906">906</a>
 <a href="#907" id="907">907</a>
+<a href="#908" id="908">908</a>
+<a href="#909" id="909">909</a>
+<a href="#910" id="910">910</a>
+<a href="#911" id="911">911</a>
+<a href="#912" id="912">912</a>
+<a href="#913" id="913">913</a>
+<a href="#914" id="914">914</a>
+<a href="#915" id="915">915</a>
+<a href="#916" id="916">916</a>
+<a href="#917" id="917">917</a>
+<a href="#918" id="918">918</a>
+<a href="#919" id="919">919</a>
+<a href="#920" id="920">920</a>
+<a href="#921" id="921">921</a>
+<a href="#922" id="922">922</a>
+<a href="#923" id="923">923</a>
+<a href="#924" id="924">924</a>
+<a href="#925" id="925">925</a>
+<a href="#926" id="926">926</a>
+<a href="#927" id="927">927</a>
+<a href="#928" id="928">928</a>
+<a href="#929" id="929">929</a>
+<a href="#930" id="930">930</a>
+<a href="#931" id="931">931</a>
+<a href="#932" id="932">932</a>
+<a href="#933" id="933">933</a>
+<a href="#934" id="934">934</a>
+<a href="#935" id="935">935</a>
+<a href="#936" id="936">936</a>
+<a href="#937" id="937">937</a>
+<a href="#938" id="938">938</a>
+<a href="#939" id="939">939</a>
+<a href="#940" id="940">940</a>
+<a href="#941" id="941">941</a>
+<a href="#942" id="942">942</a>
+<a href="#943" id="943">943</a>
+<a href="#944" id="944">944</a>
+<a href="#945" id="945">945</a>
+<a href="#946" id="946">946</a>
+<a href="#947" id="947">947</a>
+<a href="#948" id="948">948</a>
+<a href="#949" id="949">949</a>
+<a href="#950" id="950">950</a>
+<a href="#951" id="951">951</a>
+<a href="#952" id="952">952</a>
+<a href="#953" id="953">953</a>
+<a href="#954" id="954">954</a>
+<a href="#955" id="955">955</a>
+<a href="#956" id="956">956</a>
+<a href="#957" id="957">957</a>
+<a href="#958" id="958">958</a>
+<a href="#959" id="959">959</a>
+<a href="#960" id="960">960</a>
+<a href="#961" id="961">961</a>
+<a href="#962" id="962">962</a>
+<a href="#963" id="963">963</a>
+<a href="#964" id="964">964</a>
+<a href="#965" id="965">965</a>
+<a href="#966" id="966">966</a>
+<a href="#967" id="967">967</a>
+<a href="#968" id="968">968</a>
+<a href="#969" id="969">969</a>
+<a href="#970" id="970">970</a>
+<a href="#971" id="971">971</a>
+<a href="#972" id="972">972</a>
+<a href="#973" id="973">973</a>
+<a href="#974" id="974">974</a>
+<a href="#975" id="975">975</a>
+<a href="#976" id="976">976</a>
+<a href="#977" id="977">977</a>
+<a href="#978" id="978">978</a>
+<a href="#979" id="979">979</a>
+<a href="#980" id="980">980</a>
+<a href="#981" id="981">981</a>
+<a href="#982" id="982">982</a>
+<a href="#983" id="983">983</a>
+<a href="#984" id="984">984</a>
+<a href="#985" id="985">985</a>
+<a href="#986" id="986">986</a>
+<a href="#987" id="987">987</a>
+<a href="#988" id="988">988</a>
+<a href="#989" id="989">989</a>
+<a href="#990" id="990">990</a>
+<a href="#991" id="991">991</a>
+<a href="#992" id="992">992</a>
+<a href="#993" id="993">993</a>
+<a href="#994" id="994">994</a>
+<a href="#995" id="995">995</a>
+<a href="#996" id="996">996</a>
+<a href="#997" id="997">997</a>
+<a href="#998" id="998">998</a>
+<a href="#999" id="999">999</a>
+<a href="#1000" id="1000">1000</a>
+<a href="#1001" id="1001">1001</a>
+<a href="#1002" id="1002">1002</a>
+<a href="#1003" id="1003">1003</a>
+<a href="#1004" id="1004">1004</a>
+<a href="#1005" id="1005">1005</a>
+<a href="#1006" id="1006">1006</a>
+<a href="#1007" id="1007">1007</a>
+<a href="#1008" id="1008">1008</a>
+<a href="#1009" id="1009">1009</a>
+<a href="#1010" id="1010">1010</a>
+<a href="#1011" id="1011">1011</a>
+<a href="#1012" id="1012">1012</a>
+<a href="#1013" id="1013">1013</a>
+<a href="#1014" id="1014">1014</a>
+<a href="#1015" id="1015">1015</a>
+<a href="#1016" id="1016">1016</a>
+<a href="#1017" id="1017">1017</a>
+<a href="#1018" id="1018">1018</a>
 </pre><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -926,6 +1037,7 @@
 <span class="kw">use </span>std::fmt::Debug;
 <span class="kw">use </span>std::fmt::Formatter;
 <span class="kw">use </span>std::fmt::Write;
+<span class="kw">use </span>std::str::FromStr;
 <span class="kw">use </span>std::sync::Arc;
 
 <span class="kw">use </span>async_trait::async_trait;
@@ -935,9 +1047,12 @@
 <span class="kw">use </span>http::Request;
 <span class="kw">use </span>http::Response;
 <span class="kw">use </span>http::StatusCode;
+<span class="kw">use </span>http::Uri;
 <span class="kw">use </span>log::debug;
 <span class="kw">use </span>reqsign::AzureStorageSigner;
 
+<span class="kw">use </span><span class="kw">super</span>::batch::parse_batch_delete_response;
+<span class="kw">use </span><span class="kw">super</span>::batch::BatchDeleteRequestBuilder;
 <span class="kw">use </span><span class="kw">super</span>::error::parse_error;
 <span class="kw">use </span><span class="kw">super</span>::pager::AzblobPager;
 <span class="kw">use </span><span class="kw">super</span>::writer::AzblobWriter;
@@ -958,6 +1073,8 @@
     <span class="string">&quot;blob.core.chinacloudapi.cn&quot;</span>,
 ];
 
+<span class="kw">const </span>AZBLOB_BATCH_LIMIT: usize = <span class="number">256</span>;
+
 <span class="doccomment">/// Azure Storage Blob services support.
 ///
 /// # Capabilities
@@ -1304,7 +1421,16 @@
                 .account_key(key);
         }
 
-        <span class="kw">let </span>signer = signer_builder.build().map_err(|e| {
+        <span class="kw">let </span>signer = signer_builder.clone().build().map_err(|e| {
+            Error::new(ErrorKind::ConfigInvalid, <span class="string">&quot;build AzureStorageSigner&quot;</span>)
+                .with_operation(<span class="string">&quot;Builder::build&quot;</span>)
+                .with_context(<span class="string">&quot;service&quot;</span>, Scheme::Azblob)
+                .with_context(<span class="string">&quot;endpoint&quot;</span>, <span class="kw-2">&amp;</span>endpoint)
+                .with_context(<span class="string">&quot;container&quot;</span>, container.as_str())
+                .set_source(e)
+        })<span class="question-mark">?</span>;
+        signer_builder.omit_service_version();
+        <span class="kw">let </span>sub_req_signer = signer_builder.build().map_err(|e| {
             Error::new(ErrorKind::ConfigInvalid, <span class="string">&quot;build AzureStorageSigner&quot;</span>)
                 .with_operation(<span class="string">&quot;Builder::build&quot;</span>)
                 .with_context(<span class="string">&quot;service&quot;</span>, Scheme::Azblob)
@@ -1318,6 +1444,7 @@
             root,
             endpoint,
             signer: Arc::new(signer),
+            batch_signer: Arc::new(sub_req_signer),
             container: <span class="self">self</span>.container.clone(),
             client,
             _account_name: account_name.unwrap_or_default(),
@@ -1358,6 +1485,7 @@
     root: String, <span class="comment">// root will be &quot;/&quot; or /abc/
     </span>endpoint: String,
     <span class="kw">pub </span>signer: Arc&lt;AzureStorageSigner&gt;,
+    <span class="kw">pub </span>batch_signer: Arc&lt;AzureStorageSigner&gt;,
     _account_name: String,
 }
 
@@ -1378,7 +1506,8 @@
         am.set_scheme(Scheme::Azblob)
             .set_root(<span class="kw-2">&amp;</span><span class="self">self</span>.root)
             .set_name(<span class="kw-2">&amp;</span><span class="self">self</span>.container)
-            .set_capabilities(Read | Write | List | Scan)
+            .set_max_batch_operations(AZBLOB_BATCH_LIMIT)
+            .set_capabilities(Read | Write | List | Scan | Batch)
             .set_hints(ReadStreamable);
 
         am
@@ -1484,6 +1613,63 @@
 
         <span class="prelude-val">Ok</span>((RpScan::default(), op))
     }
+
+    <span class="kw">async fn </span>batch(<span class="kw-2">&amp;</span><span class="self">self</span>, args: OpBatch) -&gt; <span class="prelude-ty">Result</span>&lt;RpBatch&gt; {
+        <span class="kw">let </span>ops = args.into_operation();
+        <span class="kw">match </span>ops {
+            BatchOperations::Delete(ops) =&gt; {
+                <span class="kw">let </span>paths = ops.into_iter().map(|(p, <span class="kw">_</span>)| p).collect::&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;();
+                <span class="kw">if </span>paths.len() &gt; AZBLOB_BATCH_LIMIT {
+                    <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+                        ErrorKind::Unsupported,
+                        <span class="string">&quot;batch delete limit exceeded&quot;</span>,
+                    ));
+                }
+                <span class="comment">// construct and complete batch request
+                </span><span class="kw">let </span>resp = <span class="self">self</span>.azblob_batch_delete(<span class="kw-2">&amp;</span>paths).<span class="kw">await</span><span class="question-mark">?</span>;
+
+                <span class="comment">// check response status
+                </span><span class="kw">if </span>resp.status() != StatusCode::ACCEPTED {
+                    <span class="kw">return </span><span class="prelude-val">Err</span>(parse_error(resp).<span class="kw">await</span><span class="question-mark">?</span>);
+                }
+
+                <span class="comment">// get boundary from response header
+                </span><span class="kw">let </span>content_type = resp.headers().get(CONTENT_TYPE).ok_or_else(|| {
+                    Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;response data should have CONTENT_TYPE header&quot;</span>,
+                    )
+                })<span class="question-mark">?</span>;
+                <span class="kw">let </span>content_type = content_type
+                    .to_str()
+                    .map(|ty| ty.to_string())
+                    .map_err(|e| {
+                        Error::new(
+                            ErrorKind::Unexpected,
+                            <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;get invalid CONTENT_TYPE header in response: {:?}&quot;</span>, e),
+                        )
+                    })<span class="question-mark">?</span>;
+                <span class="kw">let </span>splits = content_type.split(<span class="string">&quot;boundary=&quot;</span>).collect::&lt;Vec&lt;<span class="kw-2">&amp;</span>str&gt;&gt;();
+                <span class="kw">let </span>boundary = splits.get(<span class="number">1</span>).to_owned().ok_or_else(|| {
+                    Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;No boundary message provided in CONTENT_TYPE&quot;</span>,
+                    )
+                })<span class="question-mark">?</span>;
+
+                <span class="kw">let </span>body = resp.into_body().bytes().<span class="kw">await</span><span class="question-mark">?</span>;
+                <span class="kw">let </span>body = String::from_utf8(body.to_vec()).map_err(|e| {
+                    Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;get invalid batch response {e:?}&quot;</span>),
+                    )
+                })<span class="question-mark">?</span>;
+
+                <span class="kw">let </span>results = parse_batch_delete_response(boundary, body, paths)<span class="question-mark">?</span>;
+                <span class="prelude-val">Ok</span>(RpBatch::new(BatchedResults::Delete(results)))
+            }
+        }
+    }
 }
 
 <span class="kw">impl </span>AzblobBackend {
@@ -1637,6 +1823,42 @@
 
         <span class="self">self</span>.client.send_async(req).<span class="kw">await
     </span>}
+
+    <span class="kw">async fn </span>azblob_batch_delete(<span class="kw-2">&amp;</span><span class="self">self</span>, paths: <span class="kw-2">&amp;</span>[String]) -&gt; <span class="prelude-ty">Result</span>&lt;Response&lt;IncomingAsyncBody&gt;&gt; {
+        <span class="comment">// init batch request
+        </span><span class="kw">let </span>url = <span class="macro">format!</span>(
+            <span class="string">&quot;{}/{}?restype=container&amp;comp=batch&quot;</span>,
+            <span class="self">self</span>.endpoint, <span class="self">self</span>.container
+        );
+        <span class="kw">let </span><span class="kw-2">mut </span>batch_delete_req_builder = BatchDeleteRequestBuilder::new(<span class="kw-2">&amp;</span>url);
+
+        <span class="kw">for </span>path <span class="kw">in </span>paths.iter() {
+            <span class="comment">// build sub requests
+            </span><span class="kw">let </span>p = build_abs_path(<span class="kw-2">&amp;</span><span class="self">self</span>.root, path);
+            <span class="kw">let </span>encoded_path = percent_encode_path(<span class="kw-2">&amp;</span>p);
+
+            <span class="kw">let </span>url = Uri::from_str(<span class="kw-2">&amp;</span><span class="macro">format!</span>(
+                <span class="string">&quot;{}/{}/{}&quot;</span>,
+                <span class="self">self</span>.endpoint, <span class="self">self</span>.container, encoded_path
+            ))
+            .unwrap();
+
+            <span class="kw">let </span><span class="kw-2">mut </span>sub_req = Request::delete(<span class="kw-2">&amp;</span>url.to_string())
+                .header(CONTENT_LENGTH, <span class="number">0</span>)
+                .body(AsyncBody::Empty)
+                .map_err(new_request_build_error)<span class="question-mark">?</span>;
+            <span class="self">self</span>.batch_signer
+                .sign(<span class="kw-2">&amp;mut </span>sub_req)
+                .map_err(new_request_sign_error)<span class="question-mark">?</span>;
+
+            batch_delete_req_builder.append(sub_req);
+        }
+
+        <span class="kw">let </span><span class="kw-2">mut </span>req = batch_delete_req_builder.try_into_req()<span class="question-mark">?</span>;
+        <span class="self">self</span>.signer.sign(<span class="kw-2">&amp;mut </span>req).map_err(new_request_sign_error)<span class="question-mark">?</span>;
+
+        <span class="self">self</span>.client.send_async(req).<span class="kw">await
+    </span>}
 }
 
 <span class="attr">#[cfg(test)]
diff --git a/docs/rust/src/opendal/services/azblob/batch.rs.html b/docs/rust/src/opendal/services/azblob/batch.rs.html
new file mode 100644
index 00000000..421fded0
--- /dev/null
+++ b/docs/rust/src/opendal/services/azblob/batch.rs.html
@@ -0,0 +1,628 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `src/services/azblob/batch.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>batch.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../static.files/SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2">< [...]
+<a href="#2" id="2">2</a>
+<a href="#3" id="3">3</a>
+<a href="#4" id="4">4</a>
+<a href="#5" id="5">5</a>
+<a href="#6" id="6">6</a>
+<a href="#7" id="7">7</a>
+<a href="#8" id="8">8</a>
+<a href="#9" id="9">9</a>
+<a href="#10" id="10">10</a>
+<a href="#11" id="11">11</a>
+<a href="#12" id="12">12</a>
+<a href="#13" id="13">13</a>
+<a href="#14" id="14">14</a>
+<a href="#15" id="15">15</a>
+<a href="#16" id="16">16</a>
+<a href="#17" id="17">17</a>
+<a href="#18" id="18">18</a>
+<a href="#19" id="19">19</a>
+<a href="#20" id="20">20</a>
+<a href="#21" id="21">21</a>
+<a href="#22" id="22">22</a>
+<a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
+<a href="#25" id="25">25</a>
+<a href="#26" id="26">26</a>
+<a href="#27" id="27">27</a>
+<a href="#28" id="28">28</a>
+<a href="#29" id="29">29</a>
+<a href="#30" id="30">30</a>
+<a href="#31" id="31">31</a>
+<a href="#32" id="32">32</a>
+<a href="#33" id="33">33</a>
+<a href="#34" id="34">34</a>
+<a href="#35" id="35">35</a>
+<a href="#36" id="36">36</a>
+<a href="#37" id="37">37</a>
+<a href="#38" id="38">38</a>
+<a href="#39" id="39">39</a>
+<a href="#40" id="40">40</a>
+<a href="#41" id="41">41</a>
+<a href="#42" id="42">42</a>
+<a href="#43" id="43">43</a>
+<a href="#44" id="44">44</a>
+<a href="#45" id="45">45</a>
+<a href="#46" id="46">46</a>
+<a href="#47" id="47">47</a>
+<a href="#48" id="48">48</a>
+<a href="#49" id="49">49</a>
+<a href="#50" id="50">50</a>
+<a href="#51" id="51">51</a>
+<a href="#52" id="52">52</a>
+<a href="#53" id="53">53</a>
+<a href="#54" id="54">54</a>
+<a href="#55" id="55">55</a>
+<a href="#56" id="56">56</a>
+<a href="#57" id="57">57</a>
+<a href="#58" id="58">58</a>
+<a href="#59" id="59">59</a>
+<a href="#60" id="60">60</a>
+<a href="#61" id="61">61</a>
+<a href="#62" id="62">62</a>
+<a href="#63" id="63">63</a>
+<a href="#64" id="64">64</a>
+<a href="#65" id="65">65</a>
+<a href="#66" id="66">66</a>
+<a href="#67" id="67">67</a>
+<a href="#68" id="68">68</a>
+<a href="#69" id="69">69</a>
+<a href="#70" id="70">70</a>
+<a href="#71" id="71">71</a>
+<a href="#72" id="72">72</a>
+<a href="#73" id="73">73</a>
+<a href="#74" id="74">74</a>
+<a href="#75" id="75">75</a>
+<a href="#76" id="76">76</a>
+<a href="#77" id="77">77</a>
+<a href="#78" id="78">78</a>
+<a href="#79" id="79">79</a>
+<a href="#80" id="80">80</a>
+<a href="#81" id="81">81</a>
+<a href="#82" id="82">82</a>
+<a href="#83" id="83">83</a>
+<a href="#84" id="84">84</a>
+<a href="#85" id="85">85</a>
+<a href="#86" id="86">86</a>
+<a href="#87" id="87">87</a>
+<a href="#88" id="88">88</a>
+<a href="#89" id="89">89</a>
+<a href="#90" id="90">90</a>
+<a href="#91" id="91">91</a>
+<a href="#92" id="92">92</a>
+<a href="#93" id="93">93</a>
+<a href="#94" id="94">94</a>
+<a href="#95" id="95">95</a>
+<a href="#96" id="96">96</a>
+<a href="#97" id="97">97</a>
+<a href="#98" id="98">98</a>
+<a href="#99" id="99">99</a>
+<a href="#100" id="100">100</a>
+<a href="#101" id="101">101</a>
+<a href="#102" id="102">102</a>
+<a href="#103" id="103">103</a>
+<a href="#104" id="104">104</a>
+<a href="#105" id="105">105</a>
+<a href="#106" id="106">106</a>
+<a href="#107" id="107">107</a>
+<a href="#108" id="108">108</a>
+<a href="#109" id="109">109</a>
+<a href="#110" id="110">110</a>
+<a href="#111" id="111">111</a>
+<a href="#112" id="112">112</a>
+<a href="#113" id="113">113</a>
+<a href="#114" id="114">114</a>
+<a href="#115" id="115">115</a>
+<a href="#116" id="116">116</a>
+<a href="#117" id="117">117</a>
+<a href="#118" id="118">118</a>
+<a href="#119" id="119">119</a>
+<a href="#120" id="120">120</a>
+<a href="#121" id="121">121</a>
+<a href="#122" id="122">122</a>
+<a href="#123" id="123">123</a>
+<a href="#124" id="124">124</a>
+<a href="#125" id="125">125</a>
+<a href="#126" id="126">126</a>
+<a href="#127" id="127">127</a>
+<a href="#128" id="128">128</a>
+<a href="#129" id="129">129</a>
+<a href="#130" id="130">130</a>
+<a href="#131" id="131">131</a>
+<a href="#132" id="132">132</a>
+<a href="#133" id="133">133</a>
+<a href="#134" id="134">134</a>
+<a href="#135" id="135">135</a>
+<a href="#136" id="136">136</a>
+<a href="#137" id="137">137</a>
+<a href="#138" id="138">138</a>
+<a href="#139" id="139">139</a>
+<a href="#140" id="140">140</a>
+<a href="#141" id="141">141</a>
+<a href="#142" id="142">142</a>
+<a href="#143" id="143">143</a>
+<a href="#144" id="144">144</a>
+<a href="#145" id="145">145</a>
+<a href="#146" id="146">146</a>
+<a href="#147" id="147">147</a>
+<a href="#148" id="148">148</a>
+<a href="#149" id="149">149</a>
+<a href="#150" id="150">150</a>
+<a href="#151" id="151">151</a>
+<a href="#152" id="152">152</a>
+<a href="#153" id="153">153</a>
+<a href="#154" id="154">154</a>
+<a href="#155" id="155">155</a>
+<a href="#156" id="156">156</a>
+<a href="#157" id="157">157</a>
+<a href="#158" id="158">158</a>
+<a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
+<a href="#182" id="182">182</a>
+<a href="#183" id="183">183</a>
+<a href="#184" id="184">184</a>
+<a href="#185" id="185">185</a>
+<a href="#186" id="186">186</a>
+<a href="#187" id="187">187</a>
+<a href="#188" id="188">188</a>
+<a href="#189" id="189">189</a>
+<a href="#190" id="190">190</a>
+<a href="#191" id="191">191</a>
+<a href="#192" id="192">192</a>
+<a href="#193" id="193">193</a>
+<a href="#194" id="194">194</a>
+<a href="#195" id="195">195</a>
+<a href="#196" id="196">196</a>
+<a href="#197" id="197">197</a>
+<a href="#198" id="198">198</a>
+<a href="#199" id="199">199</a>
+<a href="#200" id="200">200</a>
+<a href="#201" id="201">201</a>
+<a href="#202" id="202">202</a>
+<a href="#203" id="203">203</a>
+<a href="#204" id="204">204</a>
+<a href="#205" id="205">205</a>
+<a href="#206" id="206">206</a>
+<a href="#207" id="207">207</a>
+<a href="#208" id="208">208</a>
+<a href="#209" id="209">209</a>
+<a href="#210" id="210">210</a>
+<a href="#211" id="211">211</a>
+<a href="#212" id="212">212</a>
+<a href="#213" id="213">213</a>
+<a href="#214" id="214">214</a>
+<a href="#215" id="215">215</a>
+<a href="#216" id="216">216</a>
+<a href="#217" id="217">217</a>
+<a href="#218" id="218">218</a>
+<a href="#219" id="219">219</a>
+<a href="#220" id="220">220</a>
+<a href="#221" id="221">221</a>
+<a href="#222" id="222">222</a>
+<a href="#223" id="223">223</a>
+<a href="#224" id="224">224</a>
+<a href="#225" id="225">225</a>
+<a href="#226" id="226">226</a>
+<a href="#227" id="227">227</a>
+<a href="#228" id="228">228</a>
+<a href="#229" id="229">229</a>
+<a href="#230" id="230">230</a>
+<a href="#231" id="231">231</a>
+<a href="#232" id="232">232</a>
+<a href="#233" id="233">233</a>
+<a href="#234" id="234">234</a>
+<a href="#235" id="235">235</a>
+<a href="#236" id="236">236</a>
+<a href="#237" id="237">237</a>
+<a href="#238" id="238">238</a>
+<a href="#239" id="239">239</a>
+<a href="#240" id="240">240</a>
+<a href="#241" id="241">241</a>
+<a href="#242" id="242">242</a>
+<a href="#243" id="243">243</a>
+<a href="#244" id="244">244</a>
+<a href="#245" id="245">245</a>
+<a href="#246" id="246">246</a>
+<a href="#247" id="247">247</a>
+<a href="#248" id="248">248</a>
+<a href="#249" id="249">249</a>
+<a href="#250" id="250">250</a>
+<a href="#251" id="251">251</a>
+<a href="#252" id="252">252</a>
+<a href="#253" id="253">253</a>
+<a href="#254" id="254">254</a>
+<a href="#255" id="255">255</a>
+<a href="#256" id="256">256</a>
+<a href="#257" id="257">257</a>
+<a href="#258" id="258">258</a>
+<a href="#259" id="259">259</a>
+<a href="#260" id="260">260</a>
+<a href="#261" id="261">261</a>
+<a href="#262" id="262">262</a>
+<a href="#263" id="263">263</a>
+<a href="#264" id="264">264</a>
+<a href="#265" id="265">265</a>
+<a href="#266" id="266">266</a>
+<a href="#267" id="267">267</a>
+<a href="#268" id="268">268</a>
+<a href="#269" id="269">269</a>
+<a href="#270" id="270">270</a>
+<a href="#271" id="271">271</a>
+<a href="#272" id="272">272</a>
+<a href="#273" id="273">273</a>
+<a href="#274" id="274">274</a>
+<a href="#275" id="275">275</a>
+<a href="#276" id="276">276</a>
+<a href="#277" id="277">277</a>
+<a href="#278" id="278">278</a>
+<a href="#279" id="279">279</a>
+<a href="#280" id="280">280</a>
+<a href="#281" id="281">281</a>
+<a href="#282" id="282">282</a>
+<a href="#283" id="283">283</a>
+<a href="#284" id="284">284</a>
+<a href="#285" id="285">285</a>
+<a href="#286" id="286">286</a>
+<a href="#287" id="287">287</a>
+<a href="#288" id="288">288</a>
+<a href="#289" id="289">289</a>
+<a href="#290" id="290">290</a>
+<a href="#291" id="291">291</a>
+<a href="#292" id="292">292</a>
+<a href="#293" id="293">293</a>
+<a href="#294" id="294">294</a>
+<a href="#295" id="295">295</a>
+<a href="#296" id="296">296</a>
+<a href="#297" id="297">297</a>
+<a href="#298" id="298">298</a>
+<a href="#299" id="299">299</a>
+<a href="#300" id="300">300</a>
+<a href="#301" id="301">301</a>
+<a href="#302" id="302">302</a>
+<a href="#303" id="303">303</a>
+<a href="#304" id="304">304</a>
+<a href="#305" id="305">305</a>
+<a href="#306" id="306">306</a>
+<a href="#307" id="307">307</a>
+<a href="#308" id="308">308</a>
+<a href="#309" id="309">309</a>
+<a href="#310" id="310">310</a>
+<a href="#311" id="311">311</a>
+<a href="#312" id="312">312</a>
+<a href="#313" id="313">313</a>
+</pre><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// &quot;License&quot;); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+</span><span class="kw">use </span>bytes::{BufMut, BytesMut};
+<span class="kw">use </span>http::header::CONTENT_LENGTH;
+<span class="kw">use </span>http::header::CONTENT_TYPE;
+<span class="kw">use </span>http::Request;
+<span class="kw">use </span>http::StatusCode;
+<span class="kw">use </span>uuid::Uuid;
+
+<span class="kw">use </span><span class="kw">crate</span>::raw::<span class="kw-2">*</span>;
+<span class="kw">use crate</span>::<span class="kw-2">*</span>;
+
+<span class="kw">use </span><span class="kw">super</span>::error::parse_http_error;
+
+<span class="kw">const </span>AZURE_BATCH_LIMIT: usize = <span class="number">256</span>;
+
+<span class="doccomment">/// helper struct for batch requests
+</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct </span>BatchDeleteRequestBuilder {
+    url: String,
+    sub_requests: Vec&lt;Request&lt;AsyncBody&gt;&gt;,
+}
+
+<span class="kw">impl </span>BatchDeleteRequestBuilder {
+    <span class="doccomment">/// create a new batch request builder
+    </span><span class="kw">pub fn </span>new(url: <span class="kw-2">&amp;</span>str) -&gt; <span class="self">Self </span>{
+        <span class="self">Self </span>{
+            url: url.to_string(),
+            sub_requests: <span class="macro">vec!</span>[],
+        }
+    }
+    <span class="doccomment">/// append request in batch
+    ///
+    /// # Note
+    /// `sub_req` must have been signed by signer
+    </span><span class="kw">pub fn </span>append(<span class="kw-2">&amp;mut </span><span class="self">self</span>, sub_req: Request&lt;AsyncBody&gt;) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self </span>{
+        <span class="macro">debug_assert!</span>(<span class="self">self</span>.sub_requests.len() &lt; AZURE_BATCH_LIMIT);
+        <span class="self">self</span>.sub_requests.push(sub_req);
+        <span class="self">self
+    </span>}
+    <span class="doccomment">/// create an batch request, not signed by signer
+    </span><span class="kw">pub fn </span>try_into_req(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;Request&lt;AsyncBody&gt;&gt; {
+        <span class="kw">let </span>boundary = <span class="macro">format!</span>(<span class="string">&quot;opendal-{}&quot;</span>, Uuid::new_v4());
+        <span class="kw">let </span><span class="kw-2">mut </span>body = BytesMut::new();
+
+        <span class="kw">let </span>req_builder = Request::post(<span class="kw-2">&amp;</span><span class="self">self</span>.url).header(
+            CONTENT_TYPE,
+            <span class="macro">format!</span>(<span class="string">&quot;multipart/mixed; boundary={}&quot;</span>, boundary),
+        );
+
+        <span class="kw">for </span>(idx, req) <span class="kw">in </span><span class="self">self</span>.sub_requests.into_iter().enumerate() {
+            <span class="kw">let </span>headers: String = req
+                .headers()
+                .iter()
+                .map(|(k, v)| {
+                    <span class="kw">let </span>(k, v) = (k.as_str(), v.to_str().unwrap());
+                    <span class="macro">format!</span>(<span class="string">&quot;{}: {}&quot;</span>, k, v)
+                })
+                .collect::&lt;Vec&lt;String&gt;&gt;()
+                .join(<span class="string">&quot;\n&quot;</span>);
+            <span class="kw">let </span>path = req
+                .uri()
+                .path_and_query()
+                .expect(<span class="string">&quot;delete request comes with no path&quot;</span>)
+                .to_string();
+
+            <span class="kw">let </span>block = <span class="macro">format!</span>(
+                <span class="string">r#&quot;--{boundary}
+Content-Type: application/http
+Content-Transfer-Encoding: binary
+Content-ID: {idx}
+
+{} {} HTTP/1.1
+{}
+
+&quot;#</span>,
+                req.method(),
+                path,
+                headers
+            );
+            <span class="comment">// replace LF with CRLF, required by Azure Storage Blobs service.
+            //
+            // The Rust compiler converts all CRLF sequences to LF when reading source files
+            // since 2019, so it is safe to convert here
+            </span><span class="kw">let </span>block = block.replace(<span class="string">&#39;\n&#39;</span>, <span class="string">&quot;\r\n&quot;</span>);
+            body.put(block.as_bytes());
+        }
+        body.put(<span class="macro">format!</span>(<span class="string">&quot;--{}--&quot;</span>, boundary).as_bytes());
+
+        <span class="kw">let </span>content_length = body.len();
+        req_builder
+            .header(CONTENT_LENGTH, content_length)
+            .body(AsyncBody::Bytes(body.freeze()))
+            .map_err(new_request_build_error)
+    }
+}
+
+<span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>parse_batch_delete_response(
+    boundary: <span class="kw-2">&amp;</span>str,
+    body: String,
+    expect: Vec&lt;String&gt;,
+) -&gt; <span class="prelude-ty">Result</span>&lt;Vec&lt;(String, <span class="prelude-ty">Result</span>&lt;RpDelete&gt;)&gt;&gt; {
+    <span class="kw">let </span><span class="kw-2">mut </span>reps = Vec::with_capacity(expect.len());
+
+    <span class="kw">let </span><span class="kw-2">mut </span>resp_packs: Vec&lt;<span class="kw-2">&amp;</span>str&gt; = body.trim().split(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;--{boundary}&quot;</span>)).collect();
+    <span class="kw">if </span>resp_packs.len() != (expect.len() + <span class="number">2</span>) {
+        <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+            ErrorKind::Unexpected,
+            <span class="string">&quot;invalid batch delete response&quot;</span>,
+        ));
+    }
+    <span class="comment">// drop the tail
+    </span>resp_packs.pop();
+    <span class="kw">for </span>(resp_pack, name) <span class="kw">in </span>resp_packs[<span class="number">1</span>..].iter().zip(expect.into_iter()) {
+        <span class="comment">// the http body use CRLF (\r\n) instead of LF (\n)
+        // split the body at double CRLF
+        </span><span class="kw">let </span>split: Vec&lt;<span class="kw-2">&amp;</span>str&gt; = resp_pack.split(<span class="string">&quot;\r\n\r\n&quot;</span>).collect();
+
+        <span class="kw">let </span>header: Vec&lt;<span class="kw-2">&amp;</span>str&gt; = split
+            .get(<span class="number">1</span>)
+            .ok_or_else(|| Error::new(ErrorKind::Unexpected, <span class="string">&quot;Empty item in batch response&quot;</span>))<span class="question-mark">?
+            </span>.trim()
+            .split_ascii_whitespace()
+            .collect();
+
+        <span class="kw">let </span>status_code = header
+            .get(<span class="number">1</span>)
+            .ok_or_else(|| {
+                Error::new(
+                    ErrorKind::Unexpected,
+                    <span class="string">&quot;cannot find status code of HTTP response item!&quot;</span>,
+                )
+            })<span class="question-mark">?
+            </span>.parse::&lt;u16&gt;()
+            .map_err(|e| {
+                Error::new(
+                    ErrorKind::Unexpected,
+                    <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;invalid status code: {:?}&quot;</span>, e),
+                )
+            })<span class="question-mark">?
+            </span>.try_into()
+            .map_err(|e| {
+                Error::new(
+                    ErrorKind::Unexpected,
+                    <span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;invalid status code: {:?}&quot;</span>, e),
+                )
+            })<span class="question-mark">?</span>;
+
+        <span class="kw">let </span>rep = <span class="kw">match </span>status_code {
+            StatusCode::ACCEPTED | StatusCode::NOT_FOUND =&gt; (name, <span class="prelude-val">Ok</span>(RpDelete::default())),
+            s =&gt; {
+                <span class="kw">let </span>body = split.get(<span class="number">1</span>).ok_or_else(|| {
+                    Error::new(ErrorKind::Unexpected, <span class="string">&quot;Empty HTTP error response&quot;</span>)
+                })<span class="question-mark">?</span>;
+                <span class="kw">let </span>err = parse_http_error(s, body)<span class="question-mark">?</span>;
+                (name, <span class="prelude-val">Err</span>(err))
+            }
+        };
+        reps.push(rep)
+    }
+    <span class="prelude-val">Ok</span>(reps)
+}
+
+<span class="attr">#[cfg(test)]
+</span><span class="kw">mod </span>test {
+    <span class="kw">use </span>anyhow::anyhow;
+    <span class="kw">use </span>anyhow::Result;
+    <span class="kw">use </span>http::header::CONTENT_LENGTH;
+    <span class="kw">use </span>http::{header::CONTENT_TYPE, Request};
+
+    <span class="kw">use </span><span class="kw">super</span>::BatchDeleteRequestBuilder;
+    <span class="kw">use </span><span class="kw">crate</span>::raw::AsyncBody;
+    <span class="kw">use </span><span class="kw">crate</span>::services::azblob::batch::parse_batch_delete_response;
+
+    <span class="attr">#[test]
+    </span><span class="kw">fn </span>batch_delete_req_builder_test() -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+        <span class="kw">let </span>url = <span class="string">&quot;https://test.blob.core.windows.net/test&quot;</span>;
+        <span class="kw">let </span>delete_url = <span class="string">&quot;https://test.blob.core.windows.net/test/test.txt&quot;</span>;
+        <span class="kw">let </span>delete_req = Request::delete(delete_url)
+            .header(CONTENT_LENGTH, <span class="number">0</span>)
+            .body(AsyncBody::Empty)
+            .expect(<span class="string">&quot;must success&quot;</span>);
+
+        <span class="kw">let </span><span class="kw-2">mut </span>builder = BatchDeleteRequestBuilder::new(url);
+        builder.append(delete_req);
+
+        <span class="kw">let </span>req = builder.try_into_req().expect(<span class="string">&quot;must success&quot;</span>);
+
+        <span class="kw">let </span>(header, body) = req.into_parts();
+        <span class="kw">let </span>content_type = header
+            .headers
+            .get(CONTENT_TYPE)
+            .expect(<span class="string">&quot;expect header in request: CONTENT_TYPE: application/mixed.&quot;</span>)
+            .to_str()
+            .unwrap();
+        <span class="kw">let </span>boundary = content_type
+            .split(<span class="string">&quot;boundary=&quot;</span>)
+            .collect::&lt;Vec&lt;<span class="kw-2">&amp;</span>str&gt;&gt;()
+            .get(<span class="number">1</span>)
+            .expect(<span class="string">&quot;get invalid CONTENT_TYPE header in response&quot;</span>)
+            .to_owned();
+
+        <span class="kw">let </span>bs = <span class="kw">match </span>body {
+            AsyncBody::Bytes(bs) =&gt; bs,
+            <span class="kw">_ </span>=&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(<span class="macro">anyhow!</span>(<span class="string">&quot;wrong body type&quot;</span>)),
+        };
+
+        <span class="kw">let </span>s = String::from_utf8_lossy(<span class="kw-2">&amp;</span>bs);
+        <span class="kw">let </span>splits: Vec&lt;<span class="kw-2">&amp;</span>str&gt; = s.split(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">&quot;--{}&quot;</span>, boundary)).collect();
+        <span class="macro">assert_eq!</span>(splits.len(), <span class="number">3</span>);
+
+        <span class="kw">let </span>expect_body_str = <span class="string">r#&quot;
+Content-Type: application/http
+Content-Transfer-Encoding: binary
+Content-ID: 0
+
+DELETE /test/test.txt HTTP/1.1
+content-length: 0
+
+&quot;#
+        </span>.replace(<span class="string">&#39;\n&#39;</span>, <span class="string">&quot;\r\n&quot;</span>);
+        <span class="kw">let </span>actual_body_str = splits[<span class="number">1</span>];
+        <span class="macro">assert_eq!</span>(actual_body_str, expect_body_str);
+        <span class="prelude-val">Ok</span>(())
+    }
+
+    <span class="attr">#[test]
+    </span><span class="kw">fn </span>test_break_down_batch() {
+        <span class="comment">// the last item in batch is a mocked response.
+        // if stronger validation is implemented for Azblob,
+        // feel free to replace or remove it.
+        </span><span class="kw">let </span>body = <span class="string">r#&quot;--batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed
+Content-Type: application/http
+Content-ID: 0
+
+HTTP/1.1 202 Accepted
+x-ms-delete-type-permanent: true
+x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e284f
+x-ms-version: 2018-11-09
+
+--batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed
+Content-Type: application/http
+Content-ID: 1
+
+HTTP/1.1 202 Accepted
+x-ms-delete-type-permanent: true
+x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e2851
+x-ms-version: 2018-11-09
+
+--batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed
+Content-Type: application/http
+Content-ID: 2
+
+HTTP/1.1 404 The specified blob does not exist.
+x-ms-error-code: BlobNotFound
+x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e2852
+x-ms-version: 2018-11-09
+Content-Length: 216
+Content-Type: application/xml
+
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+&lt;Error&gt;&lt;Code&gt;BlobNotFound&lt;/Code&gt;&lt;Message&gt;The specified blob does not exist.
+RequestId:778fdc83-801e-0000-62ff-0334671e2852
+Time:2018-06-14T16:46:54.6040685Z&lt;/Message&gt;&lt;/Error&gt;
+
+--batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed
+Content-Type: application/http
+Content-ID: 3
+
+HTTP/1.1 403 Request to blob forbidden
+x-ms-error-code: BlobForbidden
+x-ms-request-id: 778fdc83-801e-0000-62ff-0334671e2852
+x-ms-version: 2018-11-09
+Content-Length: 216
+Content-Type: application/xml
+
+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+&lt;Error&gt;&lt;Code&gt;BlobNotFound&lt;/Code&gt;&lt;Message&gt;The specified blob does not exist.
+RequestId:778fdc83-801e-0000-62ff-0334671e2852
+Time:2018-06-14T16:46:54.6040685Z&lt;/Message&gt;&lt;/Error&gt;
+--batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed--&quot;#
+            </span>.replace(<span class="string">&#39;\n&#39;</span>, <span class="string">&quot;\r\n&quot;</span>);
+
+        <span class="kw">let </span>expected: Vec&lt;<span class="kw">_</span>&gt; = (<span class="number">0</span>..=<span class="number">3</span>).map(|n| <span class="macro">format!</span>(<span class="string">&quot;/to-del/{n}&quot;</span>)).collect();
+        <span class="kw">let </span>boundary = <span class="string">&quot;batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed&quot;</span>;
+        <span class="kw">let </span>p =
+            parse_batch_delete_response(boundary, body, expected.clone()).expect(<span class="string">&quot;must_success&quot;</span>);
+        <span class="macro">assert_eq!</span>(p.len(), expected.len());
+        <span class="kw">for </span>(idx, ((del, rep), to_del)) <span class="kw">in </span>p.into_iter().zip(expected.into_iter()).enumerate() {
+            <span class="macro">assert_eq!</span>(del, to_del);
+
+            <span class="kw">if </span>idx != <span class="number">3 </span>{
+                <span class="macro">assert!</span>(rep.is_ok());
+            } <span class="kw">else </span>{
+                <span class="macro">assert!</span>(rep.is_err());
+            }
+        }
+    }
+}
+</code></pre></div>
+</section></main><div id="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="opendal" data-themes="" data-resource-suffix="" data-rustdoc-version="1.68.0 (2c8cc3432 2023-03-06)" data-search-js="search-98d53477a794af0b.js" data-settings-js="settings-c3c521c753752a1a.js" data-settings-css="settings-08ddfdda51b8ee2e.css" ></div></body></html>
\ No newline at end of file
diff --git a/docs/rust/src/opendal/services/azblob/error.rs.html b/docs/rust/src/opendal/services/azblob/error.rs.html
index b4c15a59..dbfd1144 100644
--- a/docs/rust/src/opendal/services/azblob/error.rs.html
+++ b/docs/rust/src/opendal/services/azblob/error.rs.html
@@ -157,6 +157,28 @@
 <a href="#157" id="157">157</a>
 <a href="#158" id="158">158</a>
 <a href="#159" id="159">159</a>
+<a href="#160" id="160">160</a>
+<a href="#161" id="161">161</a>
+<a href="#162" id="162">162</a>
+<a href="#163" id="163">163</a>
+<a href="#164" id="164">164</a>
+<a href="#165" id="165">165</a>
+<a href="#166" id="166">166</a>
+<a href="#167" id="167">167</a>
+<a href="#168" id="168">168</a>
+<a href="#169" id="169">169</a>
+<a href="#170" id="170">170</a>
+<a href="#171" id="171">171</a>
+<a href="#172" id="172">172</a>
+<a href="#173" id="173">173</a>
+<a href="#174" id="174">174</a>
+<a href="#175" id="175">175</a>
+<a href="#176" id="176">176</a>
+<a href="#177" id="177">177</a>
+<a href="#178" id="178">178</a>
+<a href="#179" id="179">179</a>
+<a href="#180" id="180">180</a>
+<a href="#181" id="181">181</a>
 </pre><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -219,6 +241,28 @@
     }
 }
 
+<span class="kw">pub fn </span>parse_http_error(status: StatusCode, body: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;Error&gt; {
+    <span class="kw">let </span>(kind, retryable) = <span class="kw">match </span>status {
+        StatusCode::FORBIDDEN =&gt; (ErrorKind::PermissionDenied, <span class="bool-val">false</span>),
+        StatusCode::INTERNAL_SERVER_ERROR
+        | StatusCode::BAD_GATEWAY
+        | StatusCode::SERVICE_UNAVAILABLE
+        | StatusCode::GATEWAY_TIMEOUT =&gt; (ErrorKind::Unexpected, <span class="bool-val">true</span>),
+        <span class="kw">_ </span>=&gt; (ErrorKind::Unexpected, <span class="bool-val">false</span>),
+    };
+    <span class="kw">let </span>message = <span class="kw">match </span>de::from_str::&lt;AzblobError&gt;(body) {
+        <span class="prelude-val">Ok</span>(err) =&gt; <span class="macro">format!</span>(<span class="string">&quot;{err:?}&quot;</span>),
+        <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; body.to_string(),
+    };
+    <span class="kw">let </span><span class="kw-2">mut </span>err = Error::new(kind, <span class="kw-2">&amp;</span>message).with_context(<span class="string">&quot;response&quot;</span>, body.to_string());
+
+    <span class="kw">if </span>retryable {
+        err = err.set_temporary();
+    }
+
+    <span class="prelude-val">Ok</span>(err)
+}
+
 <span class="doccomment">/// Parse error response into Error.
 </span><span class="kw">pub async fn </span>parse_error(resp: Response&lt;IncomingAsyncBody&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;Error&gt; {
     <span class="kw">let </span>(parts, body) = resp.into_parts();
diff --git a/docs/rust/src/opendal/services/azblob/mod.rs.html b/docs/rust/src/opendal/services/azblob/mod.rs.html
index d77822d6..d46855a4 100644
--- a/docs/rust/src/opendal/services/azblob/mod.rs.html
+++ b/docs/rust/src/opendal/services/azblob/mod.rs.html
@@ -21,6 +21,7 @@
 <a href="#21" id="21">21</a>
 <a href="#22" id="22">22</a>
 <a href="#23" id="23">23</a>
+<a href="#24" id="24">24</a>
 </pre><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -41,6 +42,7 @@
 </span><span class="kw">mod </span>backend;
 <span class="kw">pub use </span>backend::AzblobBuilder <span class="kw">as </span>Azblob;
 
+<span class="kw">mod </span>batch;
 <span class="kw">mod </span>error;
 <span class="kw">mod </span>pager;
 <span class="kw">mod </span>writer;
diff --git a/docs/rust/src/opendal/types/operator/operator.rs.html b/docs/rust/src/opendal/types/operator/operator.rs.html
index 3e660d36..89acb1bc 100644
--- a/docs/rust/src/opendal/types/operator/operator.rs.html
+++ b/docs/rust/src/opendal/types/operator/operator.rs.html
@@ -1019,8 +1019,6 @@
 <a href="#1019" id="1019">1019</a>
 <a href="#1020" id="1020">1020</a>
 <a href="#1021" id="1021">1021</a>
-<a href="#1022" id="1022">1022</a>
-<a href="#1023" id="1023">1023</a>
 </pre><pre class="rust"><code><span class="comment">// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
@@ -1096,10 +1094,8 @@
     }
 
     <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>from_inner(accessor: FusedAccessor) -&gt; <span class="self">Self </span>{
-        <span class="self">Self </span>{
-            accessor,
-            limit: <span class="number">1000</span>,
-        }
+        <span class="kw">let </span>limit = accessor.info().max_batch_operations().unwrap_or(<span class="number">1000</span>);
+        <span class="self">Self </span>{ accessor, limit }
     }
 
     <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>into_inner(<span class="self">self</span>) -&gt; FusedAccessor {
diff --git a/index.html b/index.html
index 94e396e8..8028b57d 100644
--- a/index.html
+++ b/index.html
@@ -4,13 +4,13 @@
 <meta charset="UTF-8">
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Apache OpenDAL</title><meta data-rh="true" property="og:title" content="Apache OpenDAL"><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://opendal.apache.org/"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docse [...]
-<link rel="preload" href="/assets/js/runtime~main.1898480d.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.c94552c1.js" as="script">
 <link rel="preload" href="/assets/js/main.2400006f.js" as="script">
 </head>
 <body class="navigation-with-keyboard">
 <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
 <div id="docusaurus-base-url-issue-banner-container"></div><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hid [...]
-<script src="/assets/js/runtime~main.1898480d.js"></script>
+<script src="/assets/js/runtime~main.c94552c1.js"></script>
 <script src="/assets/js/main.2400006f.js"></script>
 </body>
 </html>
\ No newline at end of file