opendal 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +31 -36
  3. data/Cargo.toml +1 -1
  4. data/DEPENDENCIES.rust.tsv +25 -35
  5. data/README.md +1 -1
  6. data/core/CHANGELOG.md +4 -0
  7. data/core/Cargo.lock +128 -187
  8. data/core/Cargo.toml +95 -95
  9. data/core/DEPENDENCIES.rust.tsv +259 -289
  10. data/core/LICENSE +16 -0
  11. data/core/benches/vs_fs/Cargo.toml +1 -1
  12. data/core/benches/vs_s3/Cargo.toml +1 -1
  13. data/core/core/CHANGELOG.md +4 -0
  14. data/core/core/Cargo.toml +1 -1
  15. data/core/core/LICENSE +16 -0
  16. data/core/core/src/docs/upgrade.md +8 -0
  17. data/core/core/src/lib.rs +1 -3
  18. data/core/core/src/raw/futures_util.rs +26 -21
  19. data/core/core/src/raw/http_util/error.rs +9 -0
  20. data/core/core/src/raw/ops.rs +1 -0
  21. data/core/core/src/types/http_transport/mod.rs +30 -2
  22. data/core/core/src/types/http_transport/uri.rs +166 -0
  23. data/core/core/src/types/metadata.rs +1 -0
  24. data/core/core/src/types/mod.rs +2 -0
  25. data/core/http-transports/reqwest/Cargo.toml +1 -1
  26. data/core/http-transports/reqwest/LICENSE +16 -0
  27. data/core/http-transports/reqwest/src/lib.rs +46 -4
  28. data/core/layers/async-backtrace/Cargo.toml +2 -2
  29. data/core/layers/async-backtrace/LICENSE +16 -0
  30. data/core/layers/await-tree/Cargo.toml +2 -2
  31. data/core/layers/await-tree/LICENSE +16 -0
  32. data/core/layers/capability-check/Cargo.toml +2 -2
  33. data/core/layers/capability-check/LICENSE +16 -0
  34. data/core/layers/chaos/Cargo.toml +2 -2
  35. data/core/layers/chaos/LICENSE +16 -0
  36. data/core/layers/concurrent-limit/Cargo.toml +3 -3
  37. data/core/layers/concurrent-limit/LICENSE +16 -0
  38. data/core/layers/dtrace/Cargo.toml +2 -2
  39. data/core/layers/dtrace/LICENSE +16 -0
  40. data/core/layers/fastmetrics/Cargo.toml +3 -3
  41. data/core/layers/fastmetrics/LICENSE +16 -0
  42. data/core/layers/fastrace/Cargo.toml +2 -2
  43. data/core/layers/fastrace/LICENSE +16 -0
  44. data/core/layers/foyer/Cargo.toml +2 -2
  45. data/core/layers/foyer/LICENSE +16 -0
  46. data/core/layers/hotpath/Cargo.toml +2 -2
  47. data/core/layers/hotpath/LICENSE +16 -0
  48. data/core/layers/immutable-index/Cargo.toml +2 -2
  49. data/core/layers/immutable-index/LICENSE +16 -0
  50. data/core/layers/logging/Cargo.toml +2 -2
  51. data/core/layers/logging/LICENSE +16 -0
  52. data/core/layers/metrics/Cargo.toml +3 -3
  53. data/core/layers/metrics/LICENSE +16 -0
  54. data/core/layers/mime-guess/Cargo.toml +2 -2
  55. data/core/layers/mime-guess/LICENSE +16 -0
  56. data/core/layers/observe-metrics-common/Cargo.toml +1 -1
  57. data/core/layers/observe-metrics-common/LICENSE +16 -0
  58. data/core/layers/otelmetrics/Cargo.toml +3 -3
  59. data/core/layers/otelmetrics/LICENSE +16 -0
  60. data/core/layers/oteltrace/Cargo.toml +2 -2
  61. data/core/layers/oteltrace/LICENSE +16 -0
  62. data/core/layers/prometheus/Cargo.toml +3 -3
  63. data/core/layers/prometheus/LICENSE +16 -0
  64. data/core/layers/prometheus-client/Cargo.toml +3 -3
  65. data/core/layers/prometheus-client/LICENSE +16 -0
  66. data/core/layers/retry/Cargo.toml +4 -4
  67. data/core/layers/retry/LICENSE +16 -0
  68. data/core/layers/route/Cargo.toml +3 -3
  69. data/core/layers/route/LICENSE +16 -0
  70. data/core/layers/tail-cut/Cargo.toml +2 -2
  71. data/core/layers/tail-cut/LICENSE +16 -0
  72. data/core/layers/throttle/Cargo.toml +2 -2
  73. data/core/layers/throttle/LICENSE +16 -0
  74. data/core/layers/timeout/Cargo.toml +3 -3
  75. data/core/layers/timeout/LICENSE +16 -0
  76. data/core/layers/tracing/Cargo.toml +2 -2
  77. data/core/layers/tracing/LICENSE +16 -0
  78. data/core/services/aliyun-drive/Cargo.toml +2 -2
  79. data/core/services/aliyun-drive/LICENSE +16 -0
  80. data/core/services/alluxio/Cargo.toml +1 -1
  81. data/core/services/alluxio/LICENSE +16 -0
  82. data/core/services/azblob/Cargo.toml +2 -2
  83. data/core/services/azblob/LICENSE +16 -0
  84. data/core/services/azblob/src/backend.rs +21 -7
  85. data/core/services/azblob/src/config.rs +4 -1
  86. data/core/services/azdls/Cargo.toml +3 -3
  87. data/core/services/azdls/LICENSE +16 -0
  88. data/core/services/azfile/Cargo.toml +2 -2
  89. data/core/services/azfile/LICENSE +16 -0
  90. data/core/services/azure-common/Cargo.toml +1 -1
  91. data/core/services/azure-common/LICENSE +16 -0
  92. data/core/services/b2/Cargo.toml +2 -2
  93. data/core/services/b2/LICENSE +16 -0
  94. data/core/services/cacache/Cargo.toml +1 -1
  95. data/core/services/cacache/LICENSE +16 -0
  96. data/core/services/cloudflare-kv/Cargo.toml +1 -1
  97. data/core/services/cloudflare-kv/LICENSE +16 -0
  98. data/core/services/compfs/Cargo.toml +1 -1
  99. data/core/services/compfs/LICENSE +16 -0
  100. data/core/services/compfs/src/core.rs +27 -11
  101. data/core/services/cos/Cargo.toml +1 -1
  102. data/core/services/cos/LICENSE +16 -0
  103. data/core/services/d1/Cargo.toml +1 -1
  104. data/core/services/d1/LICENSE +16 -0
  105. data/core/services/dashmap/Cargo.toml +1 -1
  106. data/core/services/dashmap/LICENSE +16 -0
  107. data/core/services/dbfs/Cargo.toml +1 -1
  108. data/core/services/dbfs/LICENSE +16 -0
  109. data/core/services/dropbox/Cargo.toml +2 -2
  110. data/core/services/dropbox/LICENSE +16 -0
  111. data/core/services/etcd/Cargo.toml +2 -2
  112. data/core/services/etcd/LICENSE +16 -0
  113. data/core/services/etcd/src/core.rs +3 -3
  114. data/core/services/foundationdb/Cargo.toml +1 -1
  115. data/core/services/foundationdb/LICENSE +16 -0
  116. data/core/services/foyer/Cargo.toml +3 -3
  117. data/core/services/foyer/LICENSE +16 -0
  118. data/core/services/fs/Cargo.toml +1 -1
  119. data/core/services/fs/LICENSE +16 -0
  120. data/core/services/fs/src/core.rs +69 -10
  121. data/core/services/ftp/Cargo.toml +2 -2
  122. data/core/services/ftp/LICENSE +16 -0
  123. data/core/services/ftp/src/core.rs +1 -1
  124. data/core/services/ftp/src/reader.rs +1 -1
  125. data/core/services/ftp/src/writer.rs +1 -1
  126. data/core/services/gcs/Cargo.toml +3 -2
  127. data/core/services/gcs/LICENSE +16 -0
  128. data/core/services/gcs/src/composer.rs +11 -21
  129. data/core/services/gcs-grpc/Cargo.toml +1 -1
  130. data/core/services/gcs-grpc/proto/google/storage/v2/storage.proto +17 -18
  131. data/core/services/gdrive/Cargo.toml +3 -2
  132. data/core/services/gdrive/LICENSE +16 -0
  133. data/core/services/gdrive/src/docs.md +2 -0
  134. data/core/services/gdrive/src/path_index.rs +109 -18
  135. data/core/services/ghac/Cargo.toml +2 -2
  136. data/core/services/ghac/LICENSE +16 -0
  137. data/core/services/github/Cargo.toml +1 -1
  138. data/core/services/github/LICENSE +16 -0
  139. data/core/services/goosefs/Cargo.toml +13 -4
  140. data/core/services/goosefs/LICENSE +16 -0
  141. data/core/services/goosefs/README.md +11 -0
  142. data/core/services/goosefs/src/backend.rs +3 -5
  143. data/core/services/goosefs/src/core.rs +1 -1
  144. data/core/services/goosefs/src/docs.md +44 -3
  145. data/core/services/goosefs/src/reader.rs +22 -89
  146. data/core/services/gridfs/Cargo.toml +2 -2
  147. data/core/services/gridfs/LICENSE +16 -0
  148. data/core/services/hdfs/Cargo.toml +1 -1
  149. data/core/services/hdfs/LICENSE +16 -0
  150. data/core/services/hdfs-native/Cargo.toml +1 -1
  151. data/core/services/hdfs-native/LICENSE +16 -0
  152. data/core/services/hf/Cargo.toml +3 -3
  153. data/core/services/hf/LICENSE +16 -0
  154. data/core/services/hf/src/backend.rs +77 -9
  155. data/core/services/hf/src/config.rs +58 -0
  156. data/core/services/hf/src/core.rs +695 -318
  157. data/core/services/hf/src/docs.md +29 -0
  158. data/core/services/hf/src/lister.rs +3 -3
  159. data/core/services/hf/src/reader.rs +128 -143
  160. data/core/services/http/Cargo.toml +3 -3
  161. data/core/services/http/LICENSE +16 -0
  162. data/core/services/ipfs/Cargo.toml +1 -1
  163. data/core/services/ipfs/LICENSE +16 -0
  164. data/core/services/ipmfs/Cargo.toml +1 -1
  165. data/core/services/ipmfs/LICENSE +16 -0
  166. data/core/services/koofr/Cargo.toml +2 -2
  167. data/core/services/koofr/LICENSE +16 -0
  168. data/core/services/lakefs/Cargo.toml +1 -1
  169. data/core/services/lakefs/LICENSE +16 -0
  170. data/core/services/memcached/Cargo.toml +2 -2
  171. data/core/services/memcached/LICENSE +16 -0
  172. data/core/services/memcached/src/core.rs +3 -3
  173. data/core/services/mini_moka/Cargo.toml +1 -1
  174. data/core/services/mini_moka/LICENSE +16 -0
  175. data/core/services/moka/Cargo.toml +1 -1
  176. data/core/services/moka/LICENSE +16 -0
  177. data/core/services/mongodb/Cargo.toml +2 -2
  178. data/core/services/mongodb/LICENSE +16 -0
  179. data/core/services/monoiofs/Cargo.toml +2 -2
  180. data/core/services/monoiofs/LICENSE +16 -0
  181. data/core/services/monoiofs/src/core.rs +27 -11
  182. data/core/services/mysql/Cargo.toml +2 -2
  183. data/core/services/mysql/LICENSE +16 -0
  184. data/core/services/obs/Cargo.toml +1 -1
  185. data/core/services/obs/LICENSE +16 -0
  186. data/core/services/onedrive/Cargo.toml +2 -2
  187. data/core/services/onedrive/LICENSE +16 -0
  188. data/core/services/opfs/Cargo.toml +1 -1
  189. data/core/services/opfs/LICENSE +16 -0
  190. data/core/services/oss/Cargo.toml +1 -1
  191. data/core/services/oss/LICENSE +16 -0
  192. data/core/services/pcloud/Cargo.toml +1 -1
  193. data/core/services/pcloud/LICENSE +16 -0
  194. data/core/services/persy/Cargo.toml +1 -1
  195. data/core/services/persy/LICENSE +16 -0
  196. data/core/services/postgresql/Cargo.toml +2 -2
  197. data/core/services/postgresql/LICENSE +16 -0
  198. data/core/services/redb/Cargo.toml +1 -1
  199. data/core/services/redb/LICENSE +16 -0
  200. data/core/services/redis/Cargo.toml +2 -2
  201. data/core/services/redis/LICENSE +16 -0
  202. data/core/services/redis/src/core.rs +1 -1
  203. data/core/services/rocksdb/Cargo.toml +1 -1
  204. data/core/services/rocksdb/LICENSE +16 -0
  205. data/core/services/s3/Cargo.toml +1 -1
  206. data/core/services/s3/LICENSE +16 -0
  207. data/core/services/seafile/Cargo.toml +4 -2
  208. data/core/services/seafile/LICENSE +16 -0
  209. data/core/services/seafile/src/backend.rs +2 -3
  210. data/core/services/seafile/src/core.rs +189 -86
  211. data/core/services/seafile/src/docs.md +2 -0
  212. data/core/services/sftp/Cargo.toml +2 -2
  213. data/core/services/sftp/LICENSE +16 -0
  214. data/core/services/sftp/src/core.rs +1 -1
  215. data/core/services/sftp/src/reader.rs +1 -1
  216. data/core/services/sled/Cargo.toml +1 -1
  217. data/core/services/sled/LICENSE +16 -0
  218. data/core/services/sqlite/Cargo.toml +2 -2
  219. data/core/services/sqlite/LICENSE +16 -0
  220. data/core/services/surrealdb/Cargo.toml +2 -2
  221. data/core/services/surrealdb/LICENSE +16 -0
  222. data/core/services/swift/Cargo.toml +1 -1
  223. data/core/services/swift/LICENSE +16 -0
  224. data/core/services/tikv/Cargo.toml +2 -2
  225. data/core/services/tikv/LICENSE +16 -0
  226. data/core/services/tos/Cargo.toml +1 -1
  227. data/core/services/tos/LICENSE +16 -0
  228. data/core/services/upyun/Cargo.toml +1 -1
  229. data/core/services/upyun/LICENSE +16 -0
  230. data/core/services/vercel-artifacts/Cargo.toml +1 -1
  231. data/core/services/vercel-artifacts/LICENSE +16 -0
  232. data/core/services/vercel-blob/Cargo.toml +1 -1
  233. data/core/services/vercel-blob/LICENSE +16 -0
  234. data/core/services/webdav/Cargo.toml +1 -2
  235. data/core/services/webdav/LICENSE +16 -0
  236. data/core/services/webhdfs/Cargo.toml +2 -2
  237. data/core/services/webhdfs/LICENSE +16 -0
  238. data/core/services/yandex-disk/Cargo.toml +1 -1
  239. data/core/services/yandex-disk/LICENSE +16 -0
  240. data/core/src/lib.rs +1 -3
  241. data/core/testkit/Cargo.toml +4 -4
  242. data/core/testkit/LICENSE +16 -0
  243. data/core/upgrade.md +8 -0
  244. metadata +3 -2
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -34,7 +34,7 @@ all-features = true
34
34
  [dependencies]
35
35
  dashmap = "6"
36
36
  log = { workspace = true }
37
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
37
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
38
38
  serde = { workspace = true, features = ["derive"] }
39
39
 
40
40
  [dev-dependencies]
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -36,7 +36,7 @@ base64 = { workspace = true }
36
36
  bytes = { workspace = true }
37
37
  http = { workspace = true }
38
38
  log = { workspace = true }
39
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
39
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
40
40
  serde = { workspace = true, features = ["derive"] }
41
41
  serde_json = { workspace = true }
42
42
 
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -32,10 +32,10 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
- asyncband = { workspace = true }
35
+ asyncband = { workspace = true, features = ["mutex"] }
36
36
  bytes = { workspace = true }
37
37
  http = { workspace = true }
38
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
38
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
39
39
  serde = { workspace = true, features = ["derive"] }
40
40
  serde_json = { workspace = true }
41
41
 
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -32,9 +32,9 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
+ asyncband = { workspace = true, features = ["pool"] }
35
36
  etcd-client = { version = "0.19.0", features = ["tls"] }
36
- fastpool = "1.0.2"
37
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
37
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
38
38
  serde = { workspace = true, features = ["derive"] }
39
39
  tokio = { workspace = true, features = ["time"] }
40
40
 
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -15,11 +15,11 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
+ use asyncband::pool::ManageObject;
19
+ use asyncband::pool::ObjectStatus;
20
+ use asyncband::pool::bounded;
18
21
  use etcd_client::Client;
19
22
  use etcd_client::ConnectOptions;
20
- use fastpool::ManageObject;
21
- use fastpool::ObjectStatus;
22
- use fastpool::bounded;
23
23
  use std::fmt::Debug;
24
24
  use std::sync::Arc;
25
25
 
@@ -36,7 +36,7 @@ foundationdb = { version = "0.11.0", features = [
36
36
  "embedded-fdb-include",
37
37
  "fdb-7_3",
38
38
  ] }
39
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
39
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
40
40
  serde = { workspace = true, features = ["derive"] }
41
41
 
42
42
  [dev-dependencies]
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -34,12 +34,12 @@ all-features = true
34
34
  [dependencies]
35
35
  foyer = { version = "0.22.3" }
36
36
  log = { workspace = true }
37
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
37
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
38
38
  serde = { workspace = true, features = ["derive"] }
39
39
 
40
40
  [dev-dependencies]
41
- opendal = { path = "../..", version = "0.59.1", features = ["services-memory"] }
42
- opendal-core = { path = "../../core", version = "0.59.1", features = [
41
+ opendal = { path = "../..", version = "0.59.2", features = ["services-memory"] }
42
+ opendal-core = { path = "../../core", version = "0.59.2", features = [
43
43
  "services-memory",
44
44
  ] }
45
45
  size = "0.5"
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -34,7 +34,7 @@ all-features = true
34
34
  [dependencies]
35
35
  bytes = { workspace = true }
36
36
  log = { workspace = true }
37
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false, features = [
37
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false, features = [
38
38
  "internal-tokio-rt",
39
39
  ] }
40
40
  serde = { workspace = true, features = ["derive"] }
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -41,24 +41,28 @@ impl FsCore {
41
41
  /// lexical, so a key such as `../../etc/passwd` would otherwise escape the
42
42
  /// configured `root` at syscall time. The fs backend documents that "all
43
43
  /// operations will happen under this root", so we reject any key whose
44
- /// components include a `..` (parent-dir) traversal.
44
+ /// components include a `..` (parent-dir) traversal, a root directory, or a
45
+ /// path prefix: `PathBuf::join` discards the base when the key is absolute,
46
+ /// which covers `/etc/passwd` plus the Windows `C:\`, `\\?\` and UNC forms
47
+ /// that `normalize_path` leaves untouched.
45
48
  pub fn confined_join(base: &Path, path: &str) -> Result<PathBuf> {
46
49
  use std::path::Component;
47
50
  let trimmed = path.trim_end_matches('/');
48
- if Path::new(trimmed)
49
- .components()
50
- .any(|c| matches!(c, Component::ParentDir))
51
- {
52
- return Err(Error::new(
53
- ErrorKind::NotFound,
54
- "path escapes the configured root via `..`",
51
+ if Path::new(trimmed).components().any(|c| {
52
+ matches!(
53
+ c,
54
+ Component::ParentDir | Component::RootDir | Component::Prefix(_)
55
55
  )
56
- .with_context("path", path));
56
+ }) {
57
+ return Err(
58
+ Error::new(ErrorKind::NotFound, "path escapes the configured root")
59
+ .with_context("path", path),
60
+ );
57
61
  }
58
62
  Ok(base.join(trimmed))
59
63
  }
60
64
 
61
- /// Join a caller-supplied key onto `self.root`, rejecting `..` traversal.
65
+ /// Join a caller-supplied key onto `self.root`, keeping the result confined.
62
66
  #[inline]
63
67
  pub fn root_join(&self, path: &str) -> Result<PathBuf> {
64
68
  Self::confined_join(&self.root, path)
@@ -382,4 +386,59 @@ mod tests {
382
386
  let got = FsCore::get_user_metadata(&dst_path).unwrap();
383
387
  assert_eq!(got.get("key").map(String::as_str), Some("preserved123"));
384
388
  }
389
+
390
+ #[test]
391
+ fn test_confined_join_rejects_escaping_keys() {
392
+ let base = Path::new("/data/root");
393
+ for key in ["../etc/passwd", "a/../../b", "/etc/passwd", "//etc/passwd"] {
394
+ let err = FsCore::confined_join(base, key).unwrap_err();
395
+ assert_eq!(
396
+ err.kind(),
397
+ ErrorKind::NotFound,
398
+ "key should be rejected: {key}"
399
+ );
400
+ }
401
+ }
402
+
403
+ #[test]
404
+ fn test_confined_join_allows_normal_keys() {
405
+ let base = Path::new("/data/root");
406
+ assert_eq!(
407
+ FsCore::confined_join(base, "a/b.txt").unwrap(),
408
+ PathBuf::from("/data/root/a/b.txt")
409
+ );
410
+ assert_eq!(
411
+ FsCore::confined_join(base, "a/b/").unwrap(),
412
+ PathBuf::from("/data/root/a/b")
413
+ );
414
+ // The root path `/` trims to empty and resolves to the base itself.
415
+ assert_eq!(
416
+ FsCore::confined_join(base, "/").unwrap(),
417
+ PathBuf::from("/data/root")
418
+ );
419
+ }
420
+
421
+ #[cfg(unix)]
422
+ #[tokio::test]
423
+ async fn test_delete_iter_rejects_absolute_path_outside_root() {
424
+ use opendal_core::Operator;
425
+
426
+ let root_dir = tempfile::TempDir::new().unwrap();
427
+ let outside_dir = tempfile::TempDir::new().unwrap();
428
+
429
+ let outside = outside_dir.path().join("outside.txt");
430
+ std::fs::write(&outside, b"content").unwrap();
431
+
432
+ let op =
433
+ Operator::new(crate::Fs::default().root(root_dir.path().to_str().unwrap())).unwrap();
434
+
435
+ // `Deleter` takes the caller's key verbatim, so an absolute key reaches
436
+ // `root_join` without `normalize_path` having stripped the leading `/`.
437
+ let err = op
438
+ .delete_iter([outside.to_str().unwrap().to_string()])
439
+ .await
440
+ .unwrap_err();
441
+ assert_eq!(err.kind(), ErrorKind::NotFound);
442
+ assert!(outside.exists());
443
+ }
385
444
  }
@@ -32,11 +32,11 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
+ asyncband = { workspace = true, features = ["pool"] }
35
36
  bytes = { workspace = true }
36
- fastpool = "1.0.2"
37
37
  http = { workspace = true }
38
38
  log = { workspace = true }
39
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
39
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
40
40
  rustls-native-certs = "0.8"
41
41
  serde = { workspace = true, features = ["derive"] }
42
42
  suppaftp = { version = "10.0.2", default-features = false, features = [
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -18,7 +18,7 @@
18
18
  use std::sync::Arc;
19
19
  use std::time::Duration;
20
20
 
21
- use fastpool::{ManageObject, ObjectStatus, bounded};
21
+ use asyncband::pool::{ManageObject, ObjectStatus, bounded};
22
22
  use suppaftp::FtpError;
23
23
  use suppaftp::Status;
24
24
  use suppaftp::tokio::AsyncRustlsConnector;
@@ -21,8 +21,8 @@ use super::core::Manager;
21
21
  use super::core::format_ftp_error;
22
22
  use super::lister::FtpLister;
23
23
  use super::writer::FtpWriter;
24
+ use asyncband::pool::bounded;
24
25
  use bytes::BytesMut;
25
- use fastpool::bounded;
26
26
  use opendal_core::raw::*;
27
27
  use opendal_core::*;
28
28
  use std::sync::Arc;
@@ -15,8 +15,8 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
+ use asyncband::pool::bounded;
18
19
  use bytes::Buf;
19
- use fastpool::bounded;
20
20
  use tokio::io::AsyncWrite;
21
21
  use tokio::io::AsyncWriteExt;
22
22
 
@@ -36,7 +36,7 @@ async-trait = "0.1"
36
36
  bytes = { workspace = true }
37
37
  http = { workspace = true }
38
38
  log = { workspace = true }
39
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false, features = [
39
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false, features = [
40
40
  "reqsign",
41
41
  ] }
42
42
  percent-encoding = "2.3"
@@ -50,6 +50,7 @@ tokio = { workspace = true, features = ["rt"] }
50
50
  uuid = { workspace = true, features = ["v4"] }
51
51
 
52
52
  [dev-dependencies]
53
+ asyncband = { workspace = true, features = ["latch", "mutex"] }
53
54
  futures = { workspace = true }
54
55
  serde_json = { workspace = true }
55
- tokio = { workspace = true, features = ["macros", "rt-multi-thread", "sync"] }
56
+ tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@@ -199,3 +199,19 @@
199
199
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
200
  See the License for the specific language governing permissions and
201
201
  limitations under the License.
202
+
203
+
204
+ ------------------------------------------------------------------------------------
205
+ This product bundles third-party components under other open source licenses.
206
+ This section summarizes those components and their licenses. See the referenced
207
+ license files for text of these licenses.
208
+
209
+
210
+ Creative Commons Zero v1.0 Universal
211
+ ------------------------------------
212
+
213
+ bindings/dotnet/.gitignore
214
+
215
+ The above file is derived from VisualStudio.gitignore in
216
+ https://github.com/github/gitignore. Its license text is in
217
+ bindings/dotnet/LICENSE-CC0-1.0.txt.
@@ -365,11 +365,12 @@ fn new_tasks(
365
365
 
366
366
  #[cfg(test)]
367
367
  mod tests {
368
- use std::sync::Mutex;
369
368
  use std::sync::atomic::AtomicUsize;
370
369
  use std::sync::atomic::Ordering;
371
370
  use std::time::Duration;
372
371
 
372
+ use asyncband::latch::Latch;
373
+ use asyncband::mutex::Mutex;
373
374
  use futures::stream;
374
375
  use http::Method;
375
376
  use http::Response;
@@ -378,28 +379,25 @@ mod tests {
378
379
  use reqsign_core::Signer;
379
380
  use reqsign_google::RequestSigner;
380
381
  use reqsign_google::TokenCredentialProvider;
381
- use tokio::sync::Notify;
382
382
 
383
383
  use super::*;
384
384
  use opendal_core::raw::oio::Compose;
385
385
 
386
386
  struct ComposeTransport {
387
- started: AtomicUsize,
387
+ started: Latch,
388
388
  active: AtomicUsize,
389
389
  max_active: AtomicUsize,
390
390
  generation: AtomicUsize,
391
- notify: Notify,
392
391
  requests: Mutex<Vec<serde_json::Value>>,
393
392
  }
394
393
 
395
394
  impl ComposeTransport {
396
395
  fn new() -> Self {
397
396
  Self {
398
- started: AtomicUsize::new(0),
397
+ started: Latch::new(2),
399
398
  active: AtomicUsize::new(0),
400
399
  max_active: AtomicUsize::new(0),
401
400
  generation: AtomicUsize::new(1),
402
- notify: Notify::new(),
403
401
  requests: Mutex::new(Vec::new()),
404
402
  }
405
403
  }
@@ -432,21 +430,13 @@ mod tests {
432
430
 
433
431
  let value: serde_json::Value = serde_json::from_slice(&req.body().to_bytes())
434
432
  .expect("compose request body must be valid JSON");
435
- self.0.requests.lock().unwrap().push(value.clone());
433
+ self.0.requests.lock().await.push(value.clone());
436
434
 
437
435
  if req.uri().path().contains("__opendal%2Fcompose%2F") {
438
436
  let active = self.0.active.fetch_add(1, Ordering::SeqCst) + 1;
439
437
  self.0.max_active.fetch_max(active, Ordering::SeqCst);
440
- self.0.started.fetch_add(1, Ordering::SeqCst);
441
- self.0.notify.notify_waiters();
442
-
443
- loop {
444
- let notified = self.0.notify.notified();
445
- if self.0.started.load(Ordering::SeqCst) >= 2 {
446
- break;
447
- }
448
- notified.await;
449
- }
438
+ self.0.started.count_down();
439
+ self.0.started.wait().await;
450
440
  self.0.active.fetch_sub(1, Ordering::SeqCst);
451
441
  }
452
442
 
@@ -485,7 +475,7 @@ mod tests {
485
475
 
486
476
  if req.method() == Method::GET {
487
477
  self.0.metadata_reads.fetch_add(1, Ordering::SeqCst);
488
- let token = self.0.token.lock().unwrap().clone().unwrap();
478
+ let token = self.0.token.lock().await.clone().unwrap();
489
479
  let body = Buffer::from(
490
480
  serde_json::to_vec(&serde_json::json!({
491
481
  "size": "32",
@@ -504,7 +494,7 @@ mod tests {
504
494
  .as_str()
505
495
  .unwrap()
506
496
  .to_string();
507
- *self.0.token.lock().unwrap() = Some(token);
497
+ *self.0.token.lock().await = Some(token);
508
498
 
509
499
  if self.0.intermediate_posts.fetch_add(1, Ordering::SeqCst) == 0 {
510
500
  return Err(Error::new(
@@ -586,7 +576,7 @@ mod tests {
586
576
  .expect("composition must succeed");
587
577
 
588
578
  assert_eq!(transport.max_active.load(Ordering::SeqCst), 2);
589
- let requests = transport.requests.lock().unwrap();
579
+ let requests = transport.requests.lock().await;
590
580
  assert_eq!(requests.len(), 3);
591
581
 
592
582
  let source_lists: Vec<&Vec<serde_json::Value>> = requests
@@ -672,7 +662,7 @@ mod tests {
672
662
  }
673
663
  composer.close().await.expect("composition must succeed");
674
664
 
675
- let requests = transport.requests.lock().unwrap();
665
+ let requests = transport.requests.lock().await;
676
666
  assert_eq!(requests.len(), 34);
677
667
  let source_lists: Vec<&Vec<serde_json::Value>> = requests
678
668
  .iter()
@@ -36,7 +36,7 @@ bytes = { workspace = true }
36
36
  futures = { workspace = true, features = ["async-await", "std"] }
37
37
  http = { workspace = true }
38
38
  log = { workspace = true }
39
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false, features = [
39
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false, features = [
40
40
  "reqsign",
41
41
  ] }
42
42
  percent-encoding = "2"
@@ -1,21 +1,20 @@
1
- /*
2
- * Licensed to the Apache Software Foundation (ASF) under one
3
- * or more contributor license agreements. See the NOTICE file
4
- * distributed with this work for additional information
5
- * regarding copyright ownership. The ASF licenses this file
6
- * to you under the Apache License, Version 2.0 (the
7
- * "License"); you may not use this file except in compliance
8
- * with the License. You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing,
13
- * software distributed under the License is distributed on an
14
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
- * KIND, either express or implied. See the License for the
16
- * specific language governing permissions and limitations
17
- * under the License.
18
- */
1
+ // Copyright 2026 Google LLC
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ // Modified by the Apache Software Foundation: retain the wire-compatible subset
16
+ // used by OpenDAL, with unused definitions, annotations, and imports removed.
17
+ // Source: https://github.com/googleapis/googleapis/blob/2e9c5681901a2eebf7f547f0b60c895b1732415e/google/storage/v2/storage.proto
19
18
 
20
19
  syntax = "proto3";
21
20
 
@@ -32,9 +32,9 @@ version = { workspace = true }
32
32
  all-features = true
33
33
 
34
34
  [dependencies]
35
- opendal-core = { path = "../../core", version = "0.59.1", default-features = false }
35
+ opendal-core = { path = "../../core", version = "0.59.2", default-features = false }
36
36
 
37
- asyncband = { workspace = true }
37
+ asyncband = { workspace = true, features = ["mutex", "singleflight"] }
38
38
  bytes = { workspace = true }
39
39
  http = { workspace = true }
40
40
  log = { workspace = true }
@@ -42,4 +42,5 @@ serde = { workspace = true, features = ["derive"] }
42
42
  serde_json = { workspace = true }
43
43
 
44
44
  [dev-dependencies]
45
+ asyncband = { workspace = true, features = ["semaphore"] }
45
46
  tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }