Huawei Cloud OBS platform adapter for moon-file-storage
Dependencies
async test "能力位里 acl 是真的;预签名是本地算出来的,一条请求都不发" {
let transport : &@transport.Transport = @transport.AsyncHttpTransport::new()
let client = @obssdk.Client::new(
@obsconfig.Config::new(
"obs.cn-north-4.myhuaweicloud.com",
"cn-north-4",
@obsauth.Credentials::new("ak", "sk"),
),
transport,
)
let domain = "https://examplebucket.obs.cn-north-4.myhuaweicloud.com"
let platform = @obs.ObsPlatform::new(@obs.ObsPlatformConfig::{
platform: "obs",
bucket: "examplebucket",
domain: Some(domain),
client,
})
let caps = platform.capabilities()
assert_true(caps.multipart_upload)
assert_true(caps.presigned_url)
assert_true(caps.metadata)
// 与阿里云那一格正相反:写 `public-read` 被收下、匿名 GET 真取回字节(可逆),这是真桶读数
assert_true(caps.acl)
let intent = @model.FileInfo::draft("obs", "", "note", "txt")
let info = intent.stamped(@model.Stamp::{
platform: None,
path: Some("2026/10/note.txt"),
url: Some(domain + "/2026/10/note.txt"),
size: None,
create_time: None,
upload_id: None,
upload_status: None,
user_metadata: None,
})
let url = platform.presigned_url(info, @model.PresignMethod::Get, 120) catch {
_ => fail("presigned_url raised on a storage that claims the family")
}
assert_true(url.has_prefix(domain))
assert_true(url.find("X-Amz-Algorithm=AWS4-HMAC-SHA256") is Some(_))
assert_true(url.find("X-Amz-Expires=120") is Some(_))
assert_true(url.find("2026/10/note.txt") is Some(_))
}
///|
async test "没给 domain 就在发出请求之前拒;私有桶的地址不该被编成一条能打开的链接" {
let transport : &@transport.Transport = @transport.AsyncHttpTransport::new()
let client = @obssdk.Client::new(
@obsconfig.Config::new(
"obs.cn-north-4.myhuaweicloud.com",
"cn-north-4",
@obsauth.Credentials::new("ak", "sk"),
),
transport,
)
let platform = @obs.ObsPlatform::new(@obs.ObsPlatformConfig::{
platform: "obs",
bucket: "examplebucket",
domain: None,
client,
})
let refused = try {
let _ = platform.get_file("https://examplebucket.obs.cn-north-4.myhuaweicloud.com/2026/10/note.txt")
"no-error"
} catch {
@model.StorageError::InvalidInput(reason) => "InvalidInput:" + reason
_ => "other"
}
assert_true(refused.has_prefix("InvalidInput:"))
}moon add mldong/moon-file-storage-obsInstall
Download zipHuawei Cloud OBS platform adapter for moon-file-storage
Dependencies