in core/src/services/oss/backend.rs [279:376]
fn build(&mut self) -> Result<Self::Accessor> {
debug!("backend build started: {:?}", &self);
let root = normalize_root(&self.root.clone().unwrap_or_default());
debug!("backend use root {}", &root);
// Handle endpoint, region and bucket name.
let bucket = match self.bucket.is_empty() {
false => Ok(&self.bucket),
true => Err(
Error::new(ErrorKind::ConfigInvalid, "The bucket is misconfigured")
.with_context("service", Scheme::Oss),
),
}?;
let client = if let Some(client) = self.http_client.take() {
client
} else {
HttpClient::new().map_err(|err| {
err.with_operation("Builder::build")
.with_context("service", Scheme::Oss)
})?
};
// Retrieve endpoint and host by parsing the endpoint option and bucket. If presign_endpoint is not
// set, take endpoint as default presign_endpoint.
let (endpoint, host) = self.parse_endpoint(&self.endpoint, bucket)?;
debug!("backend use bucket {}, endpoint: {}", &bucket, &endpoint);
let presign_endpoint = if self.presign_endpoint.is_some() {
self.parse_endpoint(&self.presign_endpoint, bucket)?.0
} else {
endpoint.clone()
};
debug!("backend use presign_endpoint: {}", &presign_endpoint);
let server_side_encryption = match &self.server_side_encryption {
None => None,
Some(v) => Some(
build_header_value(v)
.map_err(|err| err.with_context("key", "server_side_encryption"))?,
),
};
let server_side_encryption_key_id = match &self.server_side_encryption_key_id {
None => None,
Some(v) => Some(
build_header_value(v)
.map_err(|err| err.with_context("key", "server_side_encryption_key_id"))?,
),
};
let mut cfg = AliyunConfig::default();
// Load cfg from env first.
cfg = cfg.from_env();
if let Some(v) = self.access_key_id.take() {
cfg.access_key_id = Some(v);
}
if let Some(v) = self.access_key_secret.take() {
cfg.access_key_secret = Some(v);
}
let loader = AliyunLoader::new(client.client(), cfg);
let signer = AliyunOssSigner::new(bucket);
let write_min_size = self.write_min_size.unwrap_or(DEFAULT_WRITE_MIN_SIZE);
if write_min_size < 5 * 1024 * 1024 {
return Err(Error::new(
ErrorKind::ConfigInvalid,
"The write minimum buffer size is misconfigured",
)
.with_context("service", Scheme::Oss));
}
let batch_max_operations = self
.batch_max_operations
.unwrap_or(DEFAULT_BATCH_MAX_OPERATIONS);
debug!("Backend build finished");
Ok(OssBackend {
core: Arc::new(OssCore {
root,
bucket: bucket.to_owned(),
endpoint,
host,
presign_endpoint,
signer,
loader,
client,
server_side_encryption,
server_side_encryption_key_id,
write_min_size,
batch_max_operations,
}),
})
}