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 634ee9c1 deploy: 24783d2385ff978298535dbf94dc4c302668ce81
634ee9c1 is described below

commit 634ee9c14d31c79c6c7ae08e94b9c8f531fb1424
Author: Xuanwo <[email protected]>
AuthorDate: Tue Mar 28 05:59:14 2023 +0000

    deploy: 24783d2385ff978298535dbf94dc4c302668ce81
---
 404.html                                           |   4 +-
 .../{1db64337.5a7f08fb.js => 1db64337.b7b60221.js} |   2 +-
 ...e~main.c2825215.js => runtime~main.6bcfd337.js} |   2 +-
 blog/archive/index.html                            |   4 +-
 blog/index.html                                    |   4 +-
 blog/opendal-entered-apache-incubator/index.html   |   4 +-
 blog/tags/announcement/index.html                  |   4 +-
 blog/tags/index.html                               |   4 +-
 docs/nodejs/classes/BlockingLister.html            |   4 +-
 docs/nodejs/classes/Entry.html                     |   4 +-
 docs/nodejs/classes/Lister.html                    |   4 +-
 docs/nodejs/classes/Metadata.html                  |  18 +--
 docs/nodejs/classes/Operator.html                  |  38 +++---
 docs/nodejs/classes/PresignedRequest.html          |  10 +-
 docs/overview/index.html                           |   6 +-
 docs/python/opendal.html                           |  32 ++---
 docs/python/search.js                              |   2 +-
 docs/rust/opendal/services/struct.Webdav.html      |  16 +--
 docs/rust/opendal/trait.Builder.html               |   2 +-
 .../src/opendal/services/webdav/backend.rs.html    | 114 +++++++++---------
 .../opendal/services/webdav/list_response.rs.html  | 130 +++++++++++++++++++++
 index.html                                         |   4 +-
 22 files changed, 276 insertions(+), 136 deletions(-)

diff --git a/404.html b/404.html
index ed2c120f..097cf806 100644
--- a/404.html
+++ b/404.html
@@ -5,13 +5,13 @@
 <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="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/assets/js/1db64337.5a7f08fb.js b/assets/js/1db64337.b7b60221.js
similarity index 61%
rename from assets/js/1db64337.5a7f08fb.js
rename to assets/js/1db64337.b7b60221.js
index e22da591..42d46ca4 100644
--- a/assets/js/1db64337.5a7f08fb.js
+++ b/assets/js/1db64337.b7b60221.js
@@ -1 +1 @@
-"use 
strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[372],{6777:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>n,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>d,toc:()=>v});var
 o=i(7462),r=(i(7294),i(3905));const 
a={sidebar_position:1,title:"Overview"},s=void 
0,d={unversionedId:"overview",id:"overview",title:"Overview",description:"",source:"@site/docs/overview.md",sourceDirName:".",slug:"/overview",permalink:"/docs/overview",draft:!1,editUrl:
 [...]
\ No newline at end of file
+"use 
strict";(self.webpackChunkopendal_website=self.webpackChunkopendal_website||[]).push([[372],{6777:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>n,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>d,toc:()=>v});var
 o=i(7462),r=(i(7294),i(3905));const 
a={sidebar_position:1,title:"Overview"},s=void 
0,d={unversionedId:"overview",id:"overview",title:"Overview",description:"",source:"@site/docs/overview.md",sourceDirName:".",slug:"/overview",permalink:"/docs/overview",draft:!1,editUrl:
 [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.c2825215.js 
b/assets/js/runtime~main.6bcfd337.js
similarity index 81%
rename from assets/js/runtime~main.c2825215.js
rename to assets/js/runtime~main.6bcfd337.js
index 6cf928dd..60786c9c 100644
--- a/assets/js/runtime~main.c2825215.js
+++ b/assets/js/runtime~main.6bcfd337.js
@@ -1 +1 @@
-(()=>{"use strict";var e,t,r,o,a,n={},f={};function c(e){var t=f[e];if(void 
0!==t)return t.exports;var r=f[e]={exports:{}};return 
n[e].call(r.exports,r,r.exports,c),r.exports}c.m=n,e=[],c.O=(t,r,o,a)=>{if(!r){var
 n=1/0;for(d=0;d<e.length;d++){r=e[d][0],o=e[d][1],a=e[d][2];for(var 
f=!0,i=0;i<r.length;i++)(!1&a||n>=a)&&Object.keys(c.O).every((e=>c.O[e](r[i])))?r.splice(i--,1):(f=!1,a<n&&(n=a));if(f){e.splice(d--,1);var
 b=o();void 0!==b&&(t=b)}}return t}a=a||0;for(var d=e.length;d>0&&e[d-1] [...]
\ No newline at end of file
+(()=>{"use strict";var e,t,r,o,a,n={},f={};function c(e){var t=f[e];if(void 
0!==t)return t.exports;var r=f[e]={exports:{}};return 
n[e].call(r.exports,r,r.exports,c),r.exports}c.m=n,e=[],c.O=(t,r,o,a)=>{if(!r){var
 n=1/0;for(b=0;b<e.length;b++){r=e[b][0],o=e[b][1],a=e[b][2];for(var 
f=!0,i=0;i<r.length;i++)(!1&a||n>=a)&&Object.keys(c.O).every((e=>c.O[e](r[i])))?r.splice(i--,1):(f=!1,a<n&&(n=a));if(f){e.splice(b--,1);var
 d=o();void 0!==d&&(t=d)}}return t}a=a||0;for(var b=e.length;b>0&&e[b-1] [...]
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
index 07482587..3c5c616b 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Archive | 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/blog/archive";><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="t [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
index 22094d9d..f9a7feaa 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Blog | 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/blog";><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="en"><meta data-rh="true" property="og:title" 
content="Blog | Apache OpenDAL"><meta data-rh=" [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/opendal-entered-apache-incubator/index.html 
b/blog/opendal-entered-apache-incubator/index.html
index ce256d2a..f97cd56c 100644
--- a/blog/opendal-entered-apache-incubator/index.html
+++ b/blog/opendal-entered-apache-incubator/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Way to Go: OpenDAL successfully entered Apache Incubator 
| 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/blog/opendal-entered-apache-incubator";><meta
 data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docusaurus_tag" content="default"><m [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/announcement/index.html 
b/blog/tags/announcement/index.html
index f5ec8ee3..15e0ee97 100644
--- a/blog/tags/announcement/index.html
+++ b/blog/tags/announcement/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">One post tagged with &quot;announcement&quot; | 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/blog/tags/announcement";><meta 
data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="en"><meta data-rh="true" property [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/blog/tags/index.html b/blog/tags/index.html
index b4a41f5d..8a8d149c 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,13 +5,13 @@
 <meta name="generator" content="Docusaurus v2.3.1">
 <title data-rh="true">Tags | 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/blog/tags";><meta data-rh="true" 
name="docusaurus_locale" content="en"><meta data-rh="true" 
name="docsearch:language" content="en"><meta data-rh="true" property="og:title" 
content="Tags | Apache OpenDAL"><meta data [...]
 <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/nodejs/classes/BlockingLister.html 
b/docs/nodejs/classes/BlockingLister.html
index be96d2fc..e3bfa1f5 100644
--- a/docs/nodejs/classes/BlockingLister.html
+++ b/docs/nodejs/classes/BlockingLister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">BlockingLister</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L119";>index.d.ts:119</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L119";>index.d.ts:119</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -51,7 +51,7 @@
 <li class="tsd-description">
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><a href="Entry.html" class="tsd-signature-type" 
data-tsd-kind="Class">Entry</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L120";>index.d.ts:120</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L120";>index.d.ts:120</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/nodejs/classes/Entry.html b/docs/nodejs/classes/Entry.html
index d15a1dd0..01444684 100644
--- a/docs/nodejs/classes/Entry.html
+++ b/docs/nodejs/classes/Entry.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Entry</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L86";>index.d.ts:86</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L86";>index.d.ts:86</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -53,7 +53,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L88";>index.d.ts:88</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L88";>index.d.ts:88</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/nodejs/classes/Lister.html b/docs/nodejs/classes/Lister.html
index fb3aef46..d426e559 100644
--- a/docs/nodejs/classes/Lister.html
+++ b/docs/nodejs/classes/Lister.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Lister</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L108";>index.d.ts:108</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L108";>index.d.ts:108</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -61,7 +61,7 @@ thing internally.</p>
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><a href="Entry.html" class="tsd-signature-type" 
data-tsd-kind="Class">Entry</a><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L117";>index.d.ts:117</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L117";>index.d.ts:117</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/nodejs/classes/Metadata.html 
b/docs/nodejs/classes/Metadata.html
index 49491782..c905eec3 100644
--- a/docs/nodejs/classes/Metadata.html
+++ b/docs/nodejs/classes/Metadata.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Metadata</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L90";>index.d.ts:90</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L90";>index.d.ts:90</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -63,7 +63,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">string</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L96";>index.d.ts:96</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L96";>index.d.ts:96</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="contentLength" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Length</span><a 
href="#contentLength" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -73,7 +73,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">bigint</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L98";>index.d.ts:98</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L98";>index.d.ts:98</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="contentMd5" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Md5</span><a href="#contentMd5" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -83,7 +83,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">string</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L100";>index.d.ts:100</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L100";>index.d.ts:100</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="contentType" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>content<wbr/>Type</span><a 
href="#contentType" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -93,7 +93,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">string</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L102";>index.d.ts:102</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L102";>index.d.ts:102</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="etag" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>etag</span><a href="#etag" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -103,7 +103,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">string</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L104";>index.d.ts:104</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L104";>index.d.ts:104</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="lastModified" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>last<wbr/>Modified</span><a 
href="#lastModified" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -113,7 +113,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">string</span></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L106";>index.d.ts:106</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L106";>index.d.ts:106</a></li></ul></aside></li></ul></section></section>
 <section class="tsd-panel-group tsd-member-group">
 <h2>Methods</h2>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="isDirectory" class="tsd-anchor"></a>
@@ -125,7 +125,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L92";>index.d.ts:92</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L92";>index.d.ts:92</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="isFile" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>is<wbr/>File</span><a href="#isFile" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -135,7 +135,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">boolean</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L94";>index.d.ts:94</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L94";>index.d.ts:94</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/nodejs/classes/Operator.html 
b/docs/nodejs/classes/Operator.html
index 5cf6a069..774b62c3 100644
--- a/docs/nodejs/classes/Operator.html
+++ b/docs/nodejs/classes/Operator.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">Operator</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L25";>index.d.ts:25</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L25";>index.d.ts:25</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -66,7 +66,7 @@
 <h5><code class="tsd-tag ts-flagOptional">Optional</code> options: <span 
class="tsd-signature-type">null</span><span class="tsd-signature-symbol"> | 
</span><span class="tsd-signature-type">Record</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, 
</span><span class="tsd-signature-type">string</span><span 
class="tsd-signature-symbol">&gt;</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="Operator.html" 
class="tsd-signature-type" data-tsd-kind="Class">Operator</a></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L26";>index.d.ts:26</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L26";>index.d.ts:26</a></li></ul></aside></li></ul></section></section>
 <section class="tsd-panel-group tsd-member-group">
 <h2>Methods</h2>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="createDir" class="tsd-anchor"></a>
@@ -83,7 +83,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">void</span><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L32";>index.d.ts:32</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L32";>index.d.ts:32</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="createDirSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>create<wbr/>Dir<wbr/>Sync</span><a 
href="#createDirSync" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -98,7 +98,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L34";>index.d.ts:34</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L34";>index.d.ts:34</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="delete" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>delete</span><a href="#delete" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -113,7 +113,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">void</span><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L48";>index.d.ts:48</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L48";>index.d.ts:48</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="deleteSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>delete<wbr/>Sync</span><a href="#deleteSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -128,7 +128,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L50";>index.d.ts:50</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L50";>index.d.ts:50</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="list" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>list</span><a href="#list" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -145,7 +145,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><a href="Lister.html" 
class="tsd-signature-type" data-tsd-kind="Class">Lister</a><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L58";>index.d.ts:58</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L58";>index.d.ts:58</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="listSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>list<wbr/>Sync</span><a href="#listSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -162,7 +162,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="BlockingLister.html" 
class="tsd-signature-type" data-tsd-kind="Class">BlockingLister</a></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L66";>index.d.ts:66</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L66";>index.d.ts:66</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="presignRead" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Read</span><a 
href="#presignRead" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -180,7 +180,7 @@
 <h5>expires: <span 
class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="PresignedRequest.html" 
class="tsd-signature-type" 
data-tsd-kind="Class">PresignedRequest</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L72";>index.d.ts:72</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L72";>index.d.ts:72</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="presignStat" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Stat</span><a 
href="#presignStat" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -198,7 +198,7 @@
 <h5>expires: <span 
class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="PresignedRequest.html" 
class="tsd-signature-type" 
data-tsd-kind="Class">PresignedRequest</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L84";>index.d.ts:84</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L84";>index.d.ts:84</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="presignWrite" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>presign<wbr/>Write</span><a 
href="#presignWrite" aria-label="Permalink" class="tsd-anchor-icon"><svg 
class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" 
stroke="currentColor" fill="none" stroke-linecap="round" 
stroke-linejoin="round"><use href="#icon-anchor-a"></use><use 
href="#icon-anchor-b"></use><use href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -216,7 +216,7 @@
 <h5>expires: <span 
class="tsd-signature-type">number</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="PresignedRequest.html" 
class="tsd-signature-type" 
data-tsd-kind="Class">PresignedRequest</a></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L78";>index.d.ts:78</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L78";>index.d.ts:78</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="read" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>read</span><a href="#read" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -231,7 +231,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">Buffer</span><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L40";>index.d.ts:40</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L40";>index.d.ts:40</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="readSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>read<wbr/>Sync</span><a href="#readSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -246,7 +246,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Buffer</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L42";>index.d.ts:42</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L42";>index.d.ts:42</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="scan" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan</span><a href="#scan" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -261,7 +261,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><a href="Lister.html" 
class="tsd-signature-type" data-tsd-kind="Class">Lister</a><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L44";>index.d.ts:44</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L44";>index.d.ts:44</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="scanSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>scan<wbr/>Sync</span><a href="#scanSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -276,7 +276,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="BlockingLister.html" 
class="tsd-signature-type" data-tsd-kind="Class">BlockingLister</a></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L46";>index.d.ts:46</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L46";>index.d.ts:46</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="stat" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>stat</span><a href="#stat" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -291,7 +291,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><a href="Metadata.html" 
class="tsd-signature-type" data-tsd-kind="Class">Metadata</a><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L28";>index.d.ts:28</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L28";>index.d.ts:28</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="statSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>stat<wbr/>Sync</span><a href="#statSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -306,7 +306,7 @@
 <h5>path: <span class="tsd-signature-type">string</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <a href="Metadata.html" 
class="tsd-signature-type" data-tsd-kind="Class">Metadata</a></h4><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L30";>index.d.ts:30</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L30";>index.d.ts:30</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="write" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>write</span><a href="#write" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -323,7 +323,7 @@
 <h5>content: <span class="tsd-signature-type">string</span><span 
class="tsd-signature-symbol"> | </span><span 
class="tsd-signature-type">Buffer</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Promise</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">void</span><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L36";>index.d.ts:36</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L36";>index.d.ts:36</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="writeSync" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>write<wbr/>Sync</span><a href="#writeSync" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
@@ -340,7 +340,7 @@
 <h5>content: <span class="tsd-signature-type">string</span><span 
class="tsd-signature-symbol"> | </span><span 
class="tsd-signature-type">Buffer</span></h5></li></ul></div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">void</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L38";>index.d.ts:38</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L38";>index.d.ts:38</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/nodejs/classes/PresignedRequest.html 
b/docs/nodejs/classes/PresignedRequest.html
index 8be21150..bd152920 100644
--- a/docs/nodejs/classes/PresignedRequest.html
+++ b/docs/nodejs/classes/PresignedRequest.html
@@ -20,7 +20,7 @@
 <ul class="tsd-hierarchy">
 <li><span class="target">PresignedRequest</span></li></ul></section><aside 
class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L122";>index.d.ts:122</a></li></ul></aside>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L122";>index.d.ts:122</a></li></ul></aside>
 <section class="tsd-panel-group tsd-index-group">
 <section class="tsd-panel tsd-index-panel">
 <details class="tsd-index-content tsd-index-accordion" open><summary 
class="tsd-accordion-summary tsd-index-summary">
@@ -58,7 +58,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L124";>index.d.ts:124</a></li></ul></aside></li></ul></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L124";>index.d.ts:124</a></li></ul></aside></li></ul></section>
 <section class="tsd-panel tsd-member tsd-kind-accessor 
tsd-parent-kind-class"><a id="uri" class="tsd-anchor"></a>
 <h3 class="tsd-anchor-link"><span>uri</span><a href="#uri" 
aria-label="Permalink" class="tsd-anchor-icon"><svg class="icon icon-tabler 
icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" 
fill="none" stroke-linecap="round" stroke-linejoin="round"><use 
href="#icon-anchor-a"></use><use href="#icon-anchor-b"></use><use 
href="#icon-anchor-c"></use></svg></a></h3>
 <ul class="tsd-signatures tsd-kind-accessor tsd-parent-kind-class">
@@ -68,7 +68,7 @@
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">string</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L126";>index.d.ts:126</a></li></ul></aside></li></ul></section></section>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L126";>index.d.ts:126</a></li></ul></aside></li></ul></section></section>
 <section class="tsd-panel-group tsd-member-group">
 <h2>Methods</h2>
 <section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a 
id="headers" class="tsd-anchor"></a>
@@ -77,11 +77,11 @@
 <li class="tsd-signature tsd-anchor-link" id="headers.headers-1">headers<span 
class="tsd-signature-symbol">(</span><span 
class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: 
</span><span class="tsd-signature-type">Record</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, 
</span><span class="tsd-signature-type">string</span><span 
class="tsd-signature-symbol">&gt;</span><a href="#header [...]
 <li class="tsd-description">
 <div class="tsd-comment tsd-typography"><p>Returns the headers of this 
request.</p>
-<p>The key of the map is the header name, and the value is the header value AS 
bytes.</p>
+<p>The key of the map is the header name, and the value is the header 
value.</p>
 </div>
 <h4 class="tsd-returns-title">Returns <span 
class="tsd-signature-type">Record</span><span 
class="tsd-signature-symbol">&lt;</span><span 
class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, 
</span><span class="tsd-signature-type">string</span><span 
class="tsd-signature-symbol">&gt;</span></h4><aside class="tsd-sources">
 <ul>
-<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/0fc67b6/bindings/nodejs/index.d.ts#L132";>index.d.ts:132</a></li></ul></aside></li></ul></section></section></div>
+<li>Defined in <a 
href="https://github.com/apache/incubator-opendal/blob/24783d2/bindings/nodejs/index.d.ts#L132";>index.d.ts:132</a></li></ul></aside></li></ul></section></section></div>
 <div class="col-4 col-menu menu-sticky-wrap menu-highlight">
 <div class="tsd-navigation settings">
 <details class="tsd-index-accordion"><summary class="tsd-accordion-summary">
diff --git a/docs/overview/index.html b/docs/overview/index.html
index c7e69051..b7c99c9f 100644
--- a/docs/overview/index.html
+++ b/docs/overview/index.html
@@ -5,13 +5,13 @@
 <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="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.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.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/python/opendal.html b/docs/python/opendal.html
index f2f72a5f..6b047bd4 100644
--- a/docs/python/opendal.html
+++ b/docs/python/opendal.html
@@ -155,6 +155,9 @@
             <li>
                     <a class="class" href="#Metadata">Metadata</a>
                             <ul class="memberlist">
+                        <li>
+                                <a class="variable" 
href="#Metadata.mode">mode</a>
+                        </li>
                         <li>
                                 <a class="variable" 
href="#Metadata.content_type">content_type</a>
                         </li>
@@ -164,9 +167,6 @@
                         <li>
                                 <a class="variable" 
href="#Metadata.content_length">content_length</a>
                         </li>
-                        <li>
-                                <a class="variable" 
href="#Metadata.mode">mode</a>
-                        </li>
                         <li>
                                 <a class="variable" 
href="#Metadata.etag">etag</a>
                         </li>
@@ -852,6 +852,19 @@ The default value for whence is <code>SEEK_SET</code>. 
Values for <code>whence</
     
     
 
+                            <div id="Metadata.mode" class="classattr">
+                                <div class="attr variable">
+            <span class="name">mode</span><span class="annotation">: <a 
href="#EntryMode">opendal.EntryMode</a></span>
+
+        
+    </div>
+    <a class="headerlink" href="#Metadata.mode"></a>
+    
+            <div class="docstring"><p>mode represent this entry's mode.</p>
+</div>
+
+
+                            </div>
                             <div id="Metadata.content_type" class="classattr">
                                 <div class="attr variable">
             <span class="name">content_type</span><span class="annotation">: 
Optional[str]</span>
@@ -890,19 +903,6 @@ The default value for whence is <code>SEEK_SET</code>. 
Values for <code>whence</
 </div>
 
 
-                            </div>
-                            <div id="Metadata.mode" class="classattr">
-                                <div class="attr variable">
-            <span class="name">mode</span><span class="annotation">: <a 
href="#EntryMode">opendal.EntryMode</a></span>
-
-        
-    </div>
-    <a class="headerlink" href="#Metadata.mode"></a>
-    
-            <div class="docstring"><p>mode represent this entry's mode.</p>
-</div>
-
-
                             </div>
                             <div id="Metadata.etag" class="classattr">
                                 <div class="attr variable">
diff --git a/docs/python/search.js b/docs/python/search.js
index c625d6d5..c04d1c91 100644
--- a/docs/python/search.js
+++ b/docs/python/search.js
@@ -1,6 +1,6 @@
 window.pdocSearch = (function(){
 /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver 
Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function 
e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n 
in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new 
t.Index;return 
n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return
 function(t){e.console&&console.wa [...]
-    /** pdoc search index */const docs = {"version": "0.9.5", "fields": 
["qualname", "fullname", "annotation", "default_value", "signature", "bases", 
"doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": 
"opendal", "modulename": "opendal", "kind": "module", "doc": "<p>OpenDAL Python 
binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div 
class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> 
</span>install<span class=\"w\"> </span> [...]
+    /** pdoc search index */const docs = {"version": "0.9.5", "fields": 
["qualname", "fullname", "annotation", "default_value", "signature", "bases", 
"doc"], "ref": "fullname", "documentStore": {"docs": {"opendal": {"fullname": 
"opendal", "modulename": "opendal", "kind": "module", "doc": "<p>OpenDAL Python 
binding</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div 
class=\"pdoc-code codehilite\">\n<pre><span></span><code>pip<span class=\"w\"> 
</span>install<span class=\"w\"> </span> [...]
 
     // mirrored in build-search-index.js (part 1)
     // Also split on html tags. this is a cheap heuristic, but good enough.
diff --git a/docs/rust/opendal/services/struct.Webdav.html 
b/docs/rust/opendal/services/struct.Webdav.html
index 1ad5d62f..cbbb54c1 100644
--- a/docs/rust/opendal/services/struct.Webdav.html
+++ b/docs/rust/opendal/services/struct.Webdav.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="WebDAV 
backend support."><meta name="keywords" content="rust, rustlang, rust-lang, 
Webdav"><title>Webdav in opendal::services - Rust</title><link rel="preload" 
as="font" type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2"><link 
rel="pre [...]
+<!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="WebDAV 
backend support."><meta name="keywords" content="rust, rustlang, rust-lang, 
Webdav"><title>Webdav in opendal::services - Rust</title><link rel="preload" 
as="font" type="font/woff2" crossorigin 
href="../../static.files/SourceSerif4-Regular-1f7d512b176f0f72.ttf.woff2"><link 
rel="pre [...]
 <h2 id="capabilities"><a href="#capabilities">Capabilities</a></h2>
 <p>This service can be used to:</p>
 <ul>
@@ -42,20 +42,20 @@ Users can use <code>webdav</code> to connect those 
services.</p>
     <span class="kw">let </span>op: Operator = Operator::new(builder)<span 
class="question-mark">?</span>.finish();
     <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-WebdavBuilder" class="impl 
has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#106-171">source</a><a 
href="#impl-WebdavBuilder" 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-WebdavBuilder" class="impl 
has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#107-172">source</a><a 
href="#impl-WebdavBuilder" class="anchor">§</a><h3 class="code-header">impl <a 
class="struct" href="s [...]
 <p>For example: <code>https://example.com</code></p>
-</div></details><details class="toggle method-toggle" open><summary><section 
id="method.username" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#123-128">source</a><h4 
class="code-header">pub fn <a href="#method.username" 
class="fn">username</a>(&amp;mut self, username: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/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.username" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#124-129">source</a><h4 
class="code-header">pub fn <a href="#method.username" 
class="fn">username</a>(&amp;mut self, username: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org [...]
 <p>default: no password</p>
-</div></details><details class="toggle method-toggle" open><summary><section 
id="method.password" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#133-138">source</a><h4 
class="code-header">pub fn <a href="#method.password" 
class="fn">password</a>(&amp;mut self, password: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/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.password" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#134-139">source</a><h4 
class="code-header">pub fn <a href="#method.password" 
class="fn">password</a>(&amp;mut self, password: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org [...]
 <p>default: no password</p>
-</div></details><details class="toggle method-toggle" open><summary><section 
id="method.token" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#143-148">source</a><h4 
class="code-header">pub fn <a href="#method.token" 
class="fn">token</a>(&amp;mut self, token: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org/1.68.1/std/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section 
id="method.token" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#144-149">source</a><h4 
class="code-header">pub fn <a href="#method.token" 
class="fn">token</a>(&amp;mut self, token: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org/1.68.1/std/ [...]
 <p>default: no access token</p>
-</div></details><details class="toggle method-toggle" open><summary><section 
id="method.root" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#151-159">source</a><h4 
class="code-header">pub fn <a href="#method.root" class="fn">root</a>(&amp;mut 
self, root: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org/1.68.1/std/prim [...]
-</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/webdav/backend.rs.html#167-170">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.root" class="method has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#152-160">source</a><h4 
class="code-header">pub fn <a href="#method.root" class="fn">root</a>(&amp;mut 
self, root: &amp;<a class="primitive" 
href="https://doc.rust-lang.org/1.68.1/std/primitive.str.html";>str</a>) -&gt; 
<a class="primitive" href="https://doc.rust-lang.org/1.68.1/std/prim [...]
+</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/webdav/backend.rs.html#168-171">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-1"><a href="#notes-1">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></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-WebdavBuilder" class="impl 
has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#173-231">source</a><a 
href="#impl-Builder-for-WebdavBuilder" 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-WebdavBuilder" class="impl 
has-srclink"><a class="srclink rightside" 
href="../../src/opendal/services/webdav/backend.rs.html#174-232">source</a><a 
href="#impl-Builder-for-WebdavBuilder" clas [...]
 </div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-Instrument-for-WebdavBuilder" 
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-WebdavBuilder" 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-WebdavBuilder" 
class="impl has-srclink"><a class="srclink rightside" 
href="https://doc.rust-lang.org/1.68.1/src/core/convert/mod.rs.html#717";>source</a><a
 href="#impl-Into%3CU%3E-for-WebdavBuilder" class="anchor">§</a><h [...]
diff --git a/docs/rust/opendal/trait.Builder.html 
b/docs/rust/opendal/trait.Builder.html
index 67b9b6d9..1a799166 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.1/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/src/opendal/services/webdav/backend.rs.html 
b/docs/rust/src/opendal/services/webdav/backend.rs.html
index ac717b9c..a362f6c1 100644
--- a/docs/rust/src/opendal/services/webdav/backend.rs.html
+++ b/docs/rust/src/opendal/services/webdav/backend.rs.html
@@ -571,6 +571,11 @@
 <a href="#571" id="571">571</a>
 <a href="#572" id="572">572</a>
 <a href="#573" id="573">573</a>
+<a href="#574" id="574">574</a>
+<a href="#575" id="575">575</a>
+<a href="#576" id="576">576</a>
+<a href="#577" id="577">577</a>
+<a href="#578" id="578">578</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
@@ -594,19 +599,20 @@
 
 <span class="kw">use </span>async_trait::async_trait;
 <span class="kw">use </span>bytes::Buf;
-<span class="kw">use </span>http::header;
 <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::{header, HeaderMap};
 <span class="kw">use </span>log::debug;
 
+<span class="kw">use </span><span class="kw">crate</span>::ops::<span 
class="kw-2">*</span>;
+<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_error;
 <span class="kw">use </span><span 
class="kw">super</span>::list_response::Multistatus;
 <span class="kw">use </span><span class="kw">super</span>::pager::WebdavPager;
 <span class="kw">use </span><span 
class="kw">super</span>::writer::WebdavWriter;
-<span class="kw">use </span><span class="kw">crate</span>::ops::<span 
class="kw-2">*</span>;
-<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="doccomment">/// 
[WebDAV](https://datatracker.ietf.org/doc/html/rfc4918) backend support.
 ///
@@ -802,6 +808,7 @@
         })
     }
 }
+
 <span class="doccomment">/// Backend is used to serve `Accessor` support for 
http.
 </span><span class="attr">#[derive(Clone)]
 </span><span class="kw">pub struct </span>WebdavBackend {
@@ -895,18 +902,39 @@
             <span class="kw">return </span><span 
class="prelude-val">Ok</span>(RpStat::new(Metadata::new(EntryMode::DIR)));
         }
 
-        <span class="kw">let </span>resp = <span 
class="self">self</span>.webdav_head(path).<span class="kw">await</span><span 
class="question-mark">?</span>;
+        <span class="kw">let </span><span class="kw-2">mut </span>header_map = 
HeaderMap::new();
+        <span class="comment">// not include children
+        </span>header_map.insert(<span 
class="string">&quot;Depth&quot;</span>, <span 
class="string">&quot;0&quot;</span>.parse().unwrap());
+        header_map.insert(header::ACCEPT, <span 
class="string">&quot;application/xml&quot;</span>.parse().unwrap());
+
+        <span class="kw">let </span>resp = <span 
class="self">self</span>.webdav_propfind(path, <span 
class="prelude-val">Some</span>(header_map)).<span class="kw">await</span><span 
class="question-mark">?</span>;
 
         <span class="kw">let </span>status = resp.status();
 
-        <span class="kw">match </span>status {
-            StatusCode::OK =&gt; parse_into_metadata(path, 
resp.headers()).map(RpStat::new),
-            <span class="comment">// HTTP Server like nginx could return 
FORBIDDEN if auto-index
-            // is not enabled, we should ignore them.
-            </span>StatusCode::NOT_FOUND | StatusCode::FORBIDDEN <span 
class="kw">if </span>path.ends_with(<span class="string">&#39;/&#39;</span>) 
=&gt; {
-                <span 
class="prelude-val">Ok</span>(RpStat::new(Metadata::new(EntryMode::DIR)))
+        <span class="kw">if </span>!status.is_success() {
+            <span class="kw">match </span>status {
+                <span class="comment">// HTTP Server like nginx could return 
FORBIDDEN if auto-index
+                // is not enabled, we should ignore them.
+                </span>StatusCode::NOT_FOUND | StatusCode::FORBIDDEN <span 
class="kw">if </span>path.ends_with(<span class="string">&#39;/&#39;</span>) 
=&gt; {
+                    <span 
class="prelude-val">Ok</span>(RpStat::new(Metadata::new(EntryMode::DIR)))
+                }
+                <span class="kw">_ </span>=&gt; <span 
class="prelude-val">Err</span>(parse_error(resp).<span 
class="kw">await</span><span class="question-mark">?</span>),
             }
-            <span class="kw">_ </span>=&gt; <span 
class="prelude-val">Err</span>(parse_error(resp).<span 
class="kw">await</span><span class="question-mark">?</span>),
+        } <span class="kw">else </span>{
+            <span class="kw">let </span>bs = resp.into_body().bytes().<span 
class="kw">await</span><span class="question-mark">?</span>;
+            <span class="kw">let </span>result: Multistatus =
+                
quick_xml::de::from_reader(bs.reader()).map_err(new_xml_deserialize_error)<span 
class="question-mark">?</span>;
+            <span class="kw">let </span>item = result
+                .response
+                .get(<span class="number">0</span>)
+                .ok_or_else(|| {
+                    Error::new(
+                        ErrorKind::Unexpected,
+                        <span class="string">&quot;Failed getting item stat: 
bad response&quot;</span>,
+                    )
+                })<span class="question-mark">?
+                </span>.parse_into_metadata()<span 
class="question-mark">?</span>;
+            <span class="prelude-val">Ok</span>(RpStat::new(item))
         }
     }
 
@@ -922,17 +950,10 @@
     }
 
     <span class="kw">async fn </span>list(<span class="kw-2">&amp;</span><span 
class="self">self</span>, path: <span class="kw-2">&amp;</span>str, <span 
class="kw">_</span>: OpList) -&gt; <span 
class="prelude-ty">Result</span>&lt;(RpList, <span 
class="self">Self</span>::Pager)&gt; {
-        <span class="comment">// XML body must start without a new line. 
Otherwise, the server will panic: `xmlParseChunk() failed`
-        </span><span class="kw">let </span>all_prop_xml_body = <span 
class="string">r#&quot;&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;utf-8&quot; ?&gt;
-            &lt;D:propfind xmlns:D=&quot;DAV:&quot;&gt;
-                &lt;D:allprop/&gt;
-            &lt;/D:propfind&gt;
-        &quot;#</span>;
-
-        <span class="kw">let </span>async_body = 
AsyncBody::Bytes(bytes::Bytes::from(all_prop_xml_body));
-        <span class="kw">let </span>resp = <span class="self">self
-            </span>.webdav_propfind(path, <span 
class="prelude-val">None</span>, <span 
class="string">&quot;application/xml&quot;</span>.into(), async_body)
-            .<span class="kw">await</span><span class="question-mark">?</span>;
+        <span class="kw">let </span><span class="kw-2">mut </span>header_map = 
HeaderMap::new();
+        header_map.insert(<span class="string">&quot;Depth&quot;</span>, <span 
class="string">&quot;1&quot;</span>.parse().unwrap());
+        header_map.insert(header::CONTENT_TYPE, <span 
class="string">&quot;application/xml&quot;</span>.parse().unwrap());
+        <span class="kw">let </span>resp = <span 
class="self">self</span>.webdav_propfind(path, <span 
class="prelude-val">Some</span>(header_map)).<span class="kw">await</span><span 
class="question-mark">?</span>;
         <span class="kw">let </span>status = resp.status();
 
         <span class="kw">match </span>status {
@@ -1052,28 +1073,35 @@
     <span class="kw">async fn </span>webdav_propfind(
         <span class="kw-2">&amp;</span><span class="self">self</span>,
         path: <span class="kw-2">&amp;</span>str,
-        size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
-        content_type: <span class="prelude-ty">Option</span>&lt;<span 
class="kw-2">&amp;</span>str&gt;,
-        body: AsyncBody,
+        headers: <span class="prelude-ty">Option</span>&lt;HeaderMap&gt;,
     ) -&gt; <span 
class="prelude-ty">Result</span>&lt;Response&lt;IncomingAsyncBody&gt;&gt; {
         <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>url = <span 
class="macro">format!</span>(<span class="string">&quot;{}/{}&quot;</span>, 
<span class="self">self</span>.endpoint, percent_encode_path(<span 
class="kw-2">&amp;</span>p));
-        <span class="kw">let </span><span class="kw-2">mut </span>req = 
Request::builder()
-            .method(<span class="string">&quot;PROPFIND&quot;</span>)
-            .uri(<span class="kw-2">&amp;</span>url)
-            .header(<span class="string">&quot;Depth&quot;</span>, <span 
class="string">&quot;1&quot;</span>);
+        <span class="kw">let </span><span class="kw-2">mut </span>req = 
Request::builder().method(<span 
class="string">&quot;PROPFIND&quot;</span>).uri(<span 
class="kw-2">&amp;</span>url);
 
         <span class="kw">if let </span><span 
class="prelude-val">Some</span>(auth) = <span class="kw-2">&amp;</span><span 
class="self">self</span>.authorization {
             req = req.header(header::AUTHORIZATION, auth);
         }
 
-        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(size) = size {
-            req = req.header(header::CONTENT_LENGTH, size)
+        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(headers) = headers {
+            <span class="kw">for </span>(name, value) <span class="kw">in 
</span>headers {
+                <span class="comment">// all key should be not None, otherwise 
panic
+                </span>req = req.header(name.unwrap(), value);
+            }
         }
 
-        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(mime) = content_type {
-            req = req.header(header::CONTENT_TYPE, mime)
+        <span class="comment">// rfc4918 9.1: retrieve all properties define 
in specification
+        </span><span class="kw">let </span>body;
+        {
+            req = req.header(header::CONTENT_TYPE, <span 
class="string">&quot;application/xml&quot;</span>);
+            <span class="comment">// XML body must start without a new line. 
Otherwise, the server will panic: `xmlParseChunk() failed`
+            </span><span class="kw">let </span>all_prop_xml_body = <span 
class="string">r#&quot;&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;utf-8&quot; ?&gt;
+            &lt;D:propfind xmlns:D=&quot;DAV:&quot;&gt;
+                &lt;D:allprop/&gt;
+            &lt;/D:propfind&gt;
+        &quot;#</span>;
+            body = AsyncBody::Bytes(bytes::Bytes::from(all_prop_xml_body));
         }
 
         <span class="kw">let </span>req = 
req.body(body).map_err(new_request_build_error)<span 
class="question-mark">?</span>;
@@ -1081,24 +1109,6 @@
         <span class="self">self</span>.client.send_async(req).<span 
class="kw">await
     </span>}
 
-    <span class="kw">async fn </span>webdav_head(<span 
class="kw-2">&amp;</span><span class="self">self</span>, path: <span 
class="kw-2">&amp;</span>str) -&gt; <span 
class="prelude-ty">Result</span>&lt;Response&lt;IncomingAsyncBody&gt;&gt; {
-        <span class="kw">let </span>p = build_rooted_abs_path(<span 
class="kw-2">&amp;</span><span class="self">self</span>.root, path);
-
-        <span class="kw">let </span>url = <span 
class="macro">format!</span>(<span class="string">&quot;{}{}&quot;</span>, 
<span class="self">self</span>.endpoint, percent_encode_path(<span 
class="kw-2">&amp;</span>p));
-
-        <span class="kw">let </span><span class="kw-2">mut </span>req = 
Request::head(<span class="kw-2">&amp;</span>url);
-
-        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(auth) = <span class="kw-2">&amp;</span><span 
class="self">self</span>.authorization {
-            req = req.header(header::AUTHORIZATION, auth.clone())
-        }
-
-        <span class="kw">let </span>req = req
-            .body(AsyncBody::Empty)
-            .map_err(new_request_build_error)<span 
class="question-mark">?</span>;
-
-        <span class="self">self</span>.client.send_async(req).<span 
class="kw">await
-    </span>}
-
     <span class="kw">async fn </span>webdav_delete(<span 
class="kw-2">&amp;</span><span class="self">self</span>, path: <span 
class="kw-2">&amp;</span>str) -&gt; <span 
class="prelude-ty">Result</span>&lt;Response&lt;IncomingAsyncBody&gt;&gt; {
         <span class="kw">let </span>p = build_abs_path(<span 
class="kw-2">&amp;</span><span class="self">self</span>.root, path);
 
diff --git a/docs/rust/src/opendal/services/webdav/list_response.rs.html 
b/docs/rust/src/opendal/services/webdav/list_response.rs.html
index 6b69203c..2f40e4d1 100644
--- a/docs/rust/src/opendal/services/webdav/list_response.rs.html
+++ b/docs/rust/src/opendal/services/webdav/list_response.rs.html
@@ -430,6 +430,71 @@
 <a href="#430" id="430">430</a>
 <a href="#431" id="431">431</a>
 <a href="#432" id="432">432</a>
+<a href="#433" id="433">433</a>
+<a href="#434" id="434">434</a>
+<a href="#435" id="435">435</a>
+<a href="#436" id="436">436</a>
+<a href="#437" id="437">437</a>
+<a href="#438" id="438">438</a>
+<a href="#439" id="439">439</a>
+<a href="#440" id="440">440</a>
+<a href="#441" id="441">441</a>
+<a href="#442" id="442">442</a>
+<a href="#443" id="443">443</a>
+<a href="#444" id="444">444</a>
+<a href="#445" id="445">445</a>
+<a href="#446" id="446">446</a>
+<a href="#447" id="447">447</a>
+<a href="#448" id="448">448</a>
+<a href="#449" id="449">449</a>
+<a href="#450" id="450">450</a>
+<a href="#451" id="451">451</a>
+<a href="#452" id="452">452</a>
+<a href="#453" id="453">453</a>
+<a href="#454" id="454">454</a>
+<a href="#455" id="455">455</a>
+<a href="#456" id="456">456</a>
+<a href="#457" id="457">457</a>
+<a href="#458" id="458">458</a>
+<a href="#459" id="459">459</a>
+<a href="#460" id="460">460</a>
+<a href="#461" id="461">461</a>
+<a href="#462" id="462">462</a>
+<a href="#463" id="463">463</a>
+<a href="#464" id="464">464</a>
+<a href="#465" id="465">465</a>
+<a href="#466" id="466">466</a>
+<a href="#467" id="467">467</a>
+<a href="#468" id="468">468</a>
+<a href="#469" id="469">469</a>
+<a href="#470" id="470">470</a>
+<a href="#471" id="471">471</a>
+<a href="#472" id="472">472</a>
+<a href="#473" id="473">473</a>
+<a href="#474" id="474">474</a>
+<a href="#475" id="475">475</a>
+<a href="#476" id="476">476</a>
+<a href="#477" id="477">477</a>
+<a href="#478" id="478">478</a>
+<a href="#479" id="479">479</a>
+<a href="#480" id="480">480</a>
+<a href="#481" id="481">481</a>
+<a href="#482" id="482">482</a>
+<a href="#483" id="483">483</a>
+<a href="#484" id="484">484</a>
+<a href="#485" id="485">485</a>
+<a href="#486" id="486">486</a>
+<a href="#487" id="487">487</a>
+<a href="#488" id="488">488</a>
+<a href="#489" id="489">489</a>
+<a href="#490" id="490">490</a>
+<a href="#491" id="491">491</a>
+<a href="#492" id="492">492</a>
+<a href="#493" id="493">493</a>
+<a href="#494" id="494">494</a>
+<a href="#495" id="495">495</a>
+<a href="#496" id="496">496</a>
+<a href="#497" id="497">497</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
@@ -448,6 +513,10 @@
 // under the License.
 
 </span><span class="kw">use </span>serde::Deserialize;
+<span class="kw">use </span>time::format_description::well_known::Rfc2822;
+<span class="kw">use </span>time::OffsetDateTime;
+
+<span class="kw">use crate</span>::{EntryMode, Error, ErrorKind, Metadata, 
<span class="prelude-ty">Result</span>};
 
 <span class="attr">#[derive(Deserialize, Debug, PartialEq)]
 </span><span class="kw">pub struct </span>Multistatus {
@@ -460,6 +529,58 @@
     <span class="kw">pub </span>propstat: Propstat,
 }
 
+<span class="kw">impl </span>ListOpResponse {
+    <span class="kw">pub fn </span>parse_into_metadata(<span 
class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span 
class="prelude-ty">Result</span>&lt;Metadata&gt; {
+        <span class="kw">let </span>ListOpResponse {
+            href,
+            propstat:
+                Propstat {
+                    prop:
+                        Prop {
+                            getlastmodified,
+                            getcontentlength,
+                            getcontenttype,
+                            getetag,
+                            ..
+                        },
+                    status,
+                },
+        } = <span class="self">self</span>;
+        <span class="kw">if let </span>[<span class="kw">_</span>, code, text] 
= status.split(<span class="string">&#39; 
&#39;</span>).collect::&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;()[..<span 
class="number">3</span>] {
+            <span class="comment">// As defined in 
https://tools.ietf.org/html/rfc2068#section-6.1
+            </span><span class="kw">let </span>code = 
code.parse::&lt;u16&gt;().unwrap();
+            <span class="kw">if </span>code &gt;= <span class="number">400 
</span>{
+                <span class="kw">return </span><span 
class="prelude-val">Err</span>(Error::new(
+                    ErrorKind::Unexpected,
+                    <span class="kw-2">&amp;</span><span 
class="macro">format!</span>(<span class="string">&quot;Invalid response: {} 
{}&quot;</span>, code, text),
+                ));
+            }
+        }
+
+        <span class="kw">let </span>mode = <span class="kw">if 
</span>href.ends_with(<span class="string">&#39;/&#39;</span>) {
+            EntryMode::DIR
+        } <span class="kw">else </span>{
+            EntryMode::FILE
+        };
+        <span class="kw">let </span><span class="kw-2">mut </span>m = 
Metadata::new(mode);
+
+        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(v) = getcontentlength {
+            m.set_content_length(v.parse::&lt;u64&gt;().unwrap());
+        }
+
+        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(v) = getcontenttype {
+            m.set_content_type(v);
+        }
+
+        <span class="kw">if let </span><span 
class="prelude-val">Some</span>(v) = getetag {
+            m.set_etag(v);
+        }
+        <span class="comment">// 
https://www.rfc-editor.org/rfc/rfc4918#section-14.18
+        </span>m.set_last_modified(OffsetDateTime::parse(getlastmodified, 
<span class="kw-2">&amp;</span>Rfc2822).unwrap());
+        <span class="prelude-val">Ok</span>(m)
+    }
+}
+
 <span class="attr">#[derive(Deserialize, Debug, PartialEq)]
 </span><span class="kw">pub struct </span>Propstat {
     <span class="kw">pub </span>prop: Prop,
@@ -468,7 +589,12 @@
 
 <span class="attr">#[derive(Deserialize, Debug, PartialEq)]
 </span><span class="kw">pub struct </span>Prop {
+    <span class="attr">#[serde(default)]
+    </span><span class="kw">pub </span>displayname: String,
     <span class="kw">pub </span>getlastmodified: String,
+    <span class="kw">pub </span>getetag: <span 
class="prelude-ty">Option</span>&lt;String&gt;,
+    <span class="kw">pub </span>getcontentlength: <span 
class="prelude-ty">Option</span>&lt;String&gt;,
+    <span class="kw">pub </span>getcontenttype: <span 
class="prelude-ty">Option</span>&lt;String&gt;,
     <span class="kw">pub </span>resourcetype: ResourceTypeContainer,
 }
 
@@ -544,6 +670,9 @@
 
         <span class="kw">let </span>response = 
from_str::&lt;ListOpResponse&gt;(xml).unwrap();
         <span class="macro">assert_eq!</span>(response.href, <span 
class="string">&quot;/&quot;</span>);
+
+        <span 
class="macro">assert_eq!</span>(response.propstat.prop.displayname, <span 
class="string">&quot;/&quot;</span>);
+
         <span class="macro">assert_eq!</span>(
             response.propstat.prop.getlastmodified,
             <span class="string">&quot;Tue, 01 May 2022 06:39:47 GMT&quot;
@@ -587,6 +716,7 @@
             response.propstat.prop.getlastmodified,
             <span class="string">&quot;Tue, 07 May 2022 05:52:22 GMT&quot;
         </span>);
+        <span 
class="macro">assert_eq!</span>(response.propstat.prop.getcontentlength.unwrap(),
 <span class="string">&quot;1&quot;</span>);
         <span 
class="macro">assert_eq!</span>(response.propstat.prop.resourcetype.value, 
<span class="prelude-val">None</span>);
         <span class="macro">assert_eq!</span>(response.propstat.status, <span 
class="string">&quot;HTTP/1.1 200 OK&quot;</span>);
     }
diff --git a/index.html b/index.html
index 37b46c1f..c4370c1b 100644
--- a/index.html
+++ b/index.html
@@ -5,13 +5,13 @@
 <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="alternate" type="application/atom+xml" href="/blog/atom.xml" 
title="Apache OpenDAL Atom Feed"><link rel="stylesheet" 
href="/assets/css/styles.8610ae2e.css">
-<link rel="preload" href="/assets/js/runtime~main.c2825215.js" as="script">
+<link rel="preload" href="/assets/js/runtime~main.6bcfd337.js" as="script">
 <link rel="preload" href="/assets/js/main.d23512d8.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.c2825215.js"></script>
+<script src="/assets/js/runtime~main.6bcfd337.js"></script>
 <script src="/assets/js/main.d23512d8.js"></script>
 </body>
 </html>
\ No newline at end of file

Reply via email to